15

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

B = A(A < 3);

对于不熟悉 MATLAB 的人,上述命令初始化了一个矩阵 B,该矩阵由 A 中值小于 3 的单元格组成。

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

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

我想要的是这样的:

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

谢谢。

4

4 回答 4

10

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

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

相当于 MATLAB 的

B = A(indices)
于 2013-09-14T21:21:19.617 回答
6

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

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

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

于 2014-05-12T19:44:49.940 回答
5

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

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

于 2012-11-24T10:46:30.643 回答
1

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

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

于 2018-09-16T21:35:03.993 回答