使用Eigen的子矩阵和指数

Ili*_*llo 14 c++ vectorization submatrix eigen

我正在研究一个MATLAB项目,我想用C++和Eigen重新实现计算量最大的部分.我想知道是否有办法执行以下操作(MATLAB语法):

B = A(A < 3);
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉MATLAB的人,上述命令初始化由A中单元格构成的矩阵B,其值小于3.

我从Eigen论坛的帖子中看到,可以通过以下方式获得感兴趣的指数:

MatrixXi indices = (A.array() < 3).cast<int>();
Run Code Online (Sandbox Code Playgroud)

我想拥有的是:

MatrixXd B = A(A.array() < 3);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ale*_*son 10

libigl为Eigen提供了许多包装器,使其更像是MATLAB.特别是,有一个slice功能,你可以调用:

igl::slice(A,indices,B);
Run Code Online (Sandbox Code Playgroud)

这相当于MATLAB的

B = A(indices)
Run Code Online (Sandbox Code Playgroud)


Thi*_*ilo 5

当前有一个特征请求为通过在本征错误追踪系统索引提交的选择子矩阵.因此,我怀疑这种可能性.

我能想到的唯一解决方法是手动复制数据.虽然不是很好.


Sam*_*eer 5

您只能使用 对选定元素执行操作select(),这相当于三元 ?: 运算符。这不完全是您想要的,但应该在许多情况下工作。

MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));
Run Code Online (Sandbox Code Playgroud)

如果 A<3,这将用零填充 B,否则将用 A 上的任何所需操作的结果填充。