()运算符的这种特殊用法是什么意思
What does this particular use of the () operator mean?
我有这样的表达式:
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
)。
OpenCV
您可以在OpenCV中以某种矢量化的形式简洁地编写语句:
for (int i=2; i<12; i+=3) {
Mat(M.col(i).mul(U)).copyTo(M.col(i));
}
MATLAB
值得一提的是,MATLAB代码也可以与广播一起编写:
M(:,[3 6 9 12]) = bsxfun(@times, M(:,[3 6 9 12]), U);
这避免了在存储器中复制矢量U
。它与相同
for i=3:3:12
M(:,i) = M(:,i) .* U;
end
其类似于上述C++代码。
不幸的是,这些年来,MATLAB因循环速度慢而名声不佳,人们应该总是更喜欢完全矢量化的代码而不是循环。但是,自从JIT的改进之后,在所有情况下都不再是这样了。
事实上,最后一个for循环非常快,甚至比bsxfun
或原始代码稍快!
相关文章:
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 使用 MSVC 编译时,msdpb* 文件的正确用法是什么?
- 引用和指向常量的指针的用法是什么
- 在这个C++代码中捕获的用法是什么
- constexpr 标准函子的正确用法是什么?
- ./lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a 的用法是什么
- std::forward 在参数传递中的用法是什么?
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- while(1)的用法是什么
- 逆方差的常见编程用法是什么?
- catch站点中异常的常见用法是什么
- ()运算符的这种特殊用法是什么意思
- 逗号运算符的正确用法是什么
- "!!"(否定两次)的用法是什么?
- CMake "project"指令的正确用法是什么
- “(无效)D”的用法是什么
- 在 C 语言中 &(AND) 运算符的用法是什么?
- 函数体中变量强制转换为 void 的这种用法是什么?
- std::unique_ptr 在推送到 std::vector 时的正确用法是什么?
- 取代snprintf(3)的c++习惯用法是什么?