【问题标题】:Submatrices and indices using Eigen使用 Eigen 的子矩阵和索引
【发布时间】:2012-11-12 11:19:18
【问题描述】:

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

B = A(A < 3);

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

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

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

我想要的是这样的:

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

谢谢。

【问题讨论】:

  • 这个问题还有效吗?还是在 Eigen 中同时开发了一些子矩阵索引的方法?
  • AFAIK,这方面没有任何改善。当然,我会很高兴被证明是错误的
  • Eigen bitbucket repo 中有些东西在深处搅动,所以我们可能会接近一个更好的解决方案。 eigen.tuxfamily.org/bz/show_bug.cgi?id=329#c27

标签: c++ vectorization eigen submatrix


【解决方案1】:

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

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

相当于MATLAB的

B = A(indices)

【讨论】:

  • 这是 libigl 的一个特性还是 libigl 调用了一些 Eigen 方法来做到这一点?
【解决方案2】:

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

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

如果 A

【讨论】:

    【解决方案3】:

    目前有一个feature request 用于通过在 Eigen BugTracker 系统中归档的索引来选择子矩阵。因此,我怀疑这种方式是否可行。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多