c++ - () 运算符的这种特殊用法是什么意思?

标签 c++ matlab opencv matrix slice

我有这样的表达:

M(:,[[3,6,9,12]]) =  M(:,[3,6,9,12]) .* (U * ones(1,4));

我查看了 Matlab 文档,但没有这样的示例。试图将其翻译成 OpenCV C++。这是我的代码:

  cv::Mat temp(M.rows, 4, CV_64F);
  M.col(2).copyTo(temp(cv::Rect(0,0,1,M.rows)));
  M.col(5).copyTo(temp(cv::Rect(1,0,1,M.rows)));
  M.col(8).copyTo(temp(cv::Rect(2,0,1,M.rows)));
  M.col(11).copyTo(temp(cv::Rect(3,0,1,M.rows)));
  temp = temp.mul(U * cv::Mat::ones(1,4,CV_64F));
  temp.col(0).copyTo(M(cv::Rect(2,0,1,M.rows)));
  temp.col(1).copyTo(M(cv::Rect(5,0,1,M.rows)));
  temp.col(2).copyTo(M(cv::Rect(8,0,1,M.rows)));
  temp.col(3).copyTo(M(cv::Rect(11,0,1,M.rows)));

是否正确?据我所知,我无法直接在 OpenCV 中更改这些列,也许可以使用 Eigen。也不理解作业左边的双括号。

最佳答案

在 Matlab 中,您提供的代码经过了很好的矢量化,因为这是在不使用 Mex 的情况下获得良好性能的唯一方法。然而,在 C++ 中,为了提高可读性和性能,您最好将其扩展为 for 循环。

for(int i=0; i<M.rows; ++i) {
    for(int j=2; j<12; j+=3) {    // start from 2 due to 0-based indexing
        M.at<double>(i,j) *= U.at<double>(i);
    }
}

请注意 *= 运算符的使用,它在 Matlab 中不可用。

哦,[[3,6,9,12]] 等同于 [3,6,9,12](和 3 :3:12).

关于c++ - () 运算符的这种特殊用法是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26459517/

相关文章:

image-processing - 检查一张图片是否在另一张图片上的某处/相似的最佳方法是什么?

java - 在 Android 中使用 OpenCV 进行实时纸张检测

c++ - 出错时停止代码执行 (C++)

c++ - GLM 中的模型矩阵

performance - 通过更少的操作提高代码的性能

C 函数和 NaN

matlab - 在 Matlab 中绘制球体时如何定义半径?

visual-studio-2010 - 如何找到单 channel 图像来运行 openCV 的方法 cvCanny

c++ 支持模板元编程中的最后一次调用优化

c++ - big endian 和 little endian 值是否可移植?