我需要分别计算所有列中元素的总和。
现在我正在使用:
矩阵cross_corr应该相加。
Mat cross_corr_summed;
for (int i=0;i<cross_corr.cols;i++)
{
double column_sum=0;
for (int k=0;k<cross_corr.rows;k++)
{
column_sum +=cross_corr.at<float>(k,i);
}
cross_corr_summed.push_back(column_sum);
}
问题是我的程序运行需要很长时间。这是导致这种情况可疑的部分之一。 你能否建议任何可能更快的实施???
感谢!!!
答案 0 :(得分:27)
您需要cv::reduce:
cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S);
答案 1 :(得分:1)
如果您知道数据是连续且单通道的,则可以直接访问矩阵数据:
int width = cross_corr.cols;
float* data = (float*)cross_corr.data;
Mat cross_corr_summed;
for (int i=0;i<cross_corr.cols;i++)
{
double column_sum=0;
for (int k=0;k<cross_corr.rows;k++)
{
column_sum += data[i + k*width];
}
cross_corr_summed.push_back(column_sum);
}
比使用.at_<float>()
更快。一般来说,我尽量避免使用.at()
因为它比直接访问慢。
此外,虽然cv::reduce()
(由Andrey提出)更具可读性,但我发现它在某些情况下甚至比你的实现更慢。
答案 2 :(得分:0)
Mat originalMatrix;
Mat columnSum;
for (int i = 0; i<originalMatrix.cols; i++)
columnSum.push_back(cv::sum(originalMatrix.col(i))[0]);