【问题标题】:Submatrix view from indices in Eigen来自 Eigen 中的索引的子矩阵视图
【发布时间】:2015-02-10 01:59:56
【问题描述】:

在 Eigen 中是否可以在 Matlab 中执行与以下操作等效的操作?

A=rand(10,10);
indices = [2,5,6,8,9];

B=A(indices,indices)

我想要一个子矩阵作为原始矩阵的视图,具有给定的非连续索引。 最好的选择是拥有原始矩阵的共享内存视图,这可能吗?

我想出了一个可行但不是很快的方法,因为它涉及非矢量化 for 循环:

MatrixXi slice(const MatrixXi &A, const std::set<int> &indices)
{
    int n = indices.size();
    Eigen::MatrixXi B;
    B.setZero(n,n);

    std::set<int>::const_iterator iInd1 = indices.begin();
    for (int i=0; i<n;++i)
    {
        std::set<int>::const_iterator iInd2=indices.begin();
        for (int j=0; j<n;++j)
        {
            B(i,j) = A.coeffRef(*iInd1,*iInd2);
            ++iInd2;
        }
        ++iInd1;
    }

    return B;
}

如何才能更快?

【问题讨论】:

  • '不是很快'。它在 Matlab 中有多快,您的实现有多快?你的规格是什么?您使用的是调试模式还是发布模式?

标签: c++ matlab matrix numeric eigen


【解决方案1】:

使您的矩阵遍历 col-major(这是 Eigen 中的默认值)http://eigen.tuxfamily.org/dox-devel/group__TopicStorageOrders.html

禁用调试断言,EIGEN_NO_DEBUG,参见 http://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html,正如 Deepfreeze 的评论所建议的那样。

实现矢量化版本非常重要,因为元素通常不连续。如果您愿意,请查看 AVX2 收集指令(前提是您的 CPU 支持 AVX2)

要实现矩阵视图(您称之为共享内存),您需要实现一个 Eigen 表达式,如果您精通 C++ 并了解 Eigen 代码库,这并不难。如果您愿意,我可以帮助您开始。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多