5

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

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

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);
            //...
        }
    }
}

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

4

3 回答 3

6

虽然它不可用,但当被问到问题时,Eigen 提供 Tensor 模块已有一段时间了。它仍处于“不受支持”阶段(意味着 API 可能会更改),但基本功能应该大部分是稳定的。文档分散在此处此处

于 2016-12-03T20:30:30.863 回答
2

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

MatrixXd A(60*60,60);

然后使用块操作访问它们

A0 = A.block<60,60>(0*60,0);
...
A5 = A.block<60,60>(5*60,0);
于 2017-02-01T14:24:15.893 回答
1

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

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<>对象的对象,而不是模板函数和副本。(文档
于 2013-06-14T06:17:26.797 回答