Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个()操作符的特殊用法是什么意思?_C++_Matlab_Opencv_Matrix_Slice - Fatal编程技术网

C++ 这个()操作符的特殊用法是什么意思?

C++ 这个()操作符的特殊用法是什么意思?,c++,matlab,opencv,matrix,slice,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(:,[[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(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);
    }
}
for(int i=0;iOpenCV)
您可以在OpenCV中以某种矢量化的形式简洁地编写语句:

for (int i=2; i<12; i+=3) {
    Mat(M.col(i).mul(U)).copyTo(M.col(i));
}
这避免了在内存中复制向量
U
。它与:

for i=3:3:12
    M(:,i) = M(:,i) .* U;
end

类似于上面的C++代码。 不幸的是,这些年来,MATLAB因循环速度慢而名声不佳,人们应该总是更喜欢完全矢量化的代码而不是循环。但自从JIT的改进以来,这不再适用于所有情况


事实上,最后一个for循环非常快,甚至比
bsxfun
或原始代码稍快!

我假设
U
是一个标量(即
size
1-by-1)?或者它是
size(M,1)
的列向量(即与
M
具有相同的行数)?@Shai
U
必须是size
size(M,1)x1
对于
*
的工作;
(U*one(1,4))
基本上是
repmat(U,1,4)
,我认为。
U
是列向量
大小(2*N,1),这是与代码< M>代码>相同的行大小,如果它不清楚,抱歉,很好。一个澄清:我认为Matlab从索引1开始,所以在C++中,它是索引:2,5,8,11。最后一个问题:如果两个方括号的用法是等价的,你能猜出为什么开发者使用了两个吗?idea@aledalgrande:此处使用的双方括号是多余的,因此您创建一个矩阵,如
[12;34]
[[12];[34]]
,结果是相同的。
for i=3:3:12
    M(:,i) = M(:,i) .* U;
end