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

时间:2013-06-13 22:24:47

标签: c++ pointers matrix eigen

我需要在我的代码上使用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);
            //...
        }
    }
}

但是,现在这段代码的速度非常慢,这让我觉得这可能不是最有效的方法。还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

MatrixXd A(60*60,60);

然后使用block operations

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

答案 2 :(得分:0)

另一种方法是创建一大块内存,并从中映射Eigen矩阵:

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