使用特征的子矩阵和索引

Submatrices and indices using Eigen

本文关键字:索引 特征      更新时间:2023-10-16

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

B = A(A < 3);

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

我从 Eigen 论坛上的一篇文章中看到,可以使用以下方法获取感兴趣的索引:

MatrixXi indices = (A.array() < 3).cast<int>();

我想要的是这样的:

MatrixXd B = A(A.array() < 3);

谢谢。

libigl 为本征提供了许多包装器,使其感觉更像 MATLAB。特别是,有一个slice函数,以便您可以调用:

igl::slice(A,indices,B);

相当于 MATLAB 的

B = A(indices)

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

MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));

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

目前有一个功能请求,用于通过在 Eigen BugTracker 系统上提交的索引来选择子矩阵。因此,我怀疑这种方式是否可能。

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

Eigen 主分支上的最新开发允许使用数字索引。

这是一个类似的请求,显示了数字索引的示例