使用特征矩阵构建3D结构的最有效选项

Most efficient option for build 3D structures using Eigen matrices

本文关键字:结构 有效 选项 3D 构建 特征      更新时间:2023-10-16

我需要一个3D矩阵/数组结构在我的代码,现在我依赖于我的矩阵和向量的Eigen。

现在我正在使用new创建一个3D结构:

MatrixXd* cube= new MatrixXd[60];
for (int i; i<60; i++) cube[i]=MatrixXd(60,60);

和访问值:

double val;
MatrixXd pos;
for (int i; i<60; i++){
    pos=cube[i];
    for (int j; j<60; j++){
        for (int k; k<60; k++){
            val=pos(j,k);
            //...
        }
    }
}

然而,现在这部分代码非常慢,这让我相信这可能不是最有效的方法。有其他选择吗?

当被问到这个问题时,虽然它还没有提供,但Eigen已经提供了一个Tensor模块一段时间了。它仍处于"不受支持"阶段(意味着API可能会更改),但基本功能应该基本稳定。文档分散在这里和这里。

另一种方法是创建一个非常大的内存块,并从中映射特征矩阵:

double* data = new double(60*60 * 60*60*60);
Map<MatrixXd> Mijk(data+60*(60*(60*k)+j)+i), 60, 60);
在这个阶段,您可以像使用MatrixXd对象一样使用Mijk。但是,由于这不是MatrixXd类型,如果要将其传递给函数,则函数必须:
  • 的格式为foo(Map<MatrixXd> mat)
  • 为模板函数:template<typename Der> void foo(const MatrixBase<Der>& mat)
  • 取一个Ref<MatrixXd>对象,它可以同时处理Map<>Matrix<>对象,而不是模板函数,也没有副本。(doc)

我使用的一个解决方案是形成一个包含所有需要堆叠的矩阵的胖矩阵。

MatrixXd A(60*60,60);

,然后用块操作

访问它们
A0 = A.block<60,60>(0*60,0);
...
A5 = A.block<60,60>(5*60,0);