我目前正在研究一个MATLAB项目,我想用C ++和Eigen重新实现计算量最大的部分。 我想知道是否有办法执行以下操作(MATLAB语法):
B = A(A < 3);
对于那些不熟悉MATLAB的人,上述命令初始化由A中单元格组成的矩阵B,其值小于3。
我从Eigen forum的帖子中看到,可以通过以下方式获得感兴趣的指数:
MatrixXi indices = (A.array() < 3).cast<int>();
我想拥有的是:
MatrixXd B = A(A.array() < 3);
感谢。
答案 0 :(得分:10)
libigl为Eigen提供了许多包装器,使其更像是MATLAB。特别是,有一个slice
函数,您可以调用:
igl::slice(A,indices,B);
相当于MATLAB的
B = A(indices)
答案 1 :(得分:5)
目前有一个feature request用于通过在Eigen BugTracker系统提交索引来选择子矩阵。因此,我怀疑这种可能性。
我能想到的唯一解决方法是手动复制数据。虽然不是很好。
答案 2 :(得分:4)
您只能使用select()
对所选元素执行操作,这与三元?:运算符等效。这不完全是你想要的,但在许多情况下都应该有用。
MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));
如果A <3,则将B填充零,否则对A进行任何所需操作的结果。
答案 3 :(得分:0)
Eigen主分支上的最新开发成果允许使用数字索引。
Here是类似的请求,显示了数字索引的示例