本文主要是介绍Mat矩阵如何获取元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【前排注释】:来源于openCV官方文档http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat
问题:对矩阵内所有的正数求和,需要遍历每个元素,累加。
想法一:
遍历,累加
double sum = 0;
for (int i = 0; i < M.rows; i++) {
const double* Mi = M.ptr(i);
for(int j = 0; j< M.cols; j++) {
sum += std::max(Mi[j], 0);
}
}
想法二:
想法一比较暴力,没有很好的变通性。在累加之前我们可以先判断一下整个矩阵是不是连续的。如果是连续的,那么就可以把整个矩阵看成是一个很长的一维数组。【连续就是元素的内存地址是否连续,内存很大时一般时连续的,连续的存储有利于快速扫描】
double sum = 0;
int cols = M.cols;
int rows = M.rows;
if (M.isContinuous()) {
cols = cols rows;
rows = 1;
}
for (int i = 0; i < rows; i++) {
const double *Mi = M.ptr(i);
for (int j = 0; j< cols; j++) {
sum += std::max(Mi[j], 0);
}
}
这个方法在于提前判断了M矩阵是否连续,如果连续,那么求和过程中的外层for循环只需要一次,大大降低了开销。
isContinuous()函数解释:
该函数返回被检测矩阵每一行的最后面是不是连续的。通常来说,1*N的矩阵都是连续的,create()函数创建的矩阵是连续的。但是如果是在矩阵中提取一部分元素作为新矩阵,如函数col(),diag()等, 还有就是为已分配数据部分内存的空间申请头部信息,也可能不会连续。
该函数检测矩阵是不是连续并不是通过遍历矩阵的方式,而是检测矩阵头部信息的标志位,这个标志位是在你创建矩阵头部信息的时候就计算出来的,因此判断矩阵是否连续是一个十分快速的操作。
想法三:
STL模板迭代器可以智能的避开每一行结尾不连续的部分。
double sum = 0;
MatConstIterator_ it = M.begin(), it_end = M.end();
for (; it != it_end; ++it) {
sum += std::max(*it, 0);
}
Mat矩阵的迭代器可以应用在任何STL算法中,包括排序算法 std::sort()
这篇关于Mat矩阵如何获取元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!