使用Eigen的子矩阵和指数

时间:2012-11-24 09:57:32

标签: c++ vectorization eigen submatrix

我目前正在研究一个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);

感谢。

4 个答案:

答案 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是类似的请求,显示了数字索引的示例