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

joa*_*dre 5 c++ pointers matrix eigen

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

现在我正在使用new以下方法创建 3D 结构:

MatrixXd* cube= new MatrixXd[60];
for (int i; i<60; i++) cube[i]=MatrixXd(60,60);
Run Code Online (Sandbox Code Playgroud)

和访问值:

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);
            //...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

cht*_*htz 5

虽然它不可用,但当提出问题时,Eigen 已经提供了一段时间的 Tensor 模块。它仍处于“不受支持”的阶段(意味着 API 可能会发生变化),但基本功能应该基本稳定。文档分散在此处此处


gga*_*ael 3

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

double* data = new double(60*60 * 60*60*60);

Map<MatrixXd> Mijk(data+60*(60*(60*k)+j)+i), 60, 60);
Run Code Online (Sandbox Code Playgroud)

在此阶段,您可以像 MatrixXd 对象一样使用 Mijk。但是,由于这不是 MatrixXd 类型,因此如果您想将其传递给函数,您的函数必须:

  • 具有以下形式foo(Map<MatrixXd> mat)
  • 是一个模板函数:template<typename Der> void foo(const MatrixBase<Der>& mat)
  • 获取一个Ref<MatrixXd>可以处理Map<>Matrix<>对象的对象,而不是模板函数并且没有副本。(文档