我需要计算元素的总和中的所有列分开。
现在,我使用:
矩阵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);
}
问题是,我的程序需要相当长的时间来运行。 这部分是可疑导致这种之一。 你可以建议任何可能更快地实现???
谢谢!!!
你需要一个CV ::减少 :
cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S);
如果你知道你的数据是连续的,单通道,您可以直接访问矩阵数据:
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()
由安德烈建议)是更可读,我发现它比你甚至在某些情况下,实现慢。
Mat originalMatrix;
Mat columnSum;
for (int i = 0; i<originalMatrix.cols; i++)
columnSum.push_back(cv::sum(originalMatrix.col(i))[0]);