Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用特征矩阵构建三维结构的最有效选项_C++_Pointers_Matrix_Eigen - Fatal编程技术网

C++ 使用特征矩阵构建三维结构的最有效选项

C++ 使用特征矩阵构建三维结构的最有效选项,c++,pointers,matrix,eigen,C++,Pointers,Matrix,Eigen,我的代码需要一个3D矩阵/数组结构,现在我的矩阵和向量都依赖于Eigen 现在,我正在使用new创建一个3D结构: MatrixXd* cube= new MatrixXd[60]; for (int i; i<60; i++) cube[i]=MatrixXd(60,60); MatrixXd*cube=新的MatrixXd[60]; 对于(int i;i而言,另一种方法是创建一个非常大的内存块,并从中映射特征矩阵: double* data = new double(60*60 *

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

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

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

对于(int i;i而言,另一种方法是创建一个非常大的内存块,并从中映射特征矩阵:

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

Map<MatrixXd> Mijk(data+60*(60*(60*k)+j)+i), 60, 60);
double*数据=新的双精度(60*60*60*60*60);
地图Mijk(数据+60*(60*(60*k)+j)+i),60,60);
在这个阶段,您可以像MatrixXd对象一样使用Mijk。但是,由于这不是MatrixXd类型,如果要将其传递给函数,函数必须:

  • 采用
    foo(地图垫)
  • 成为模板函数:
    template void foo(const MatrixBase&mat)
  • Ref
    对象为例,该对象可以处理
    Map
    Matrix
    对象,而无需模板函数和副本。()

虽然不可用,但当被问及这个问题时,艾根已经提供了一个张量模块一段时间了。它仍然处于“不受支持”的阶段(意味着API可能会改变),但基本功能应该基本稳定。文档是分散的。

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

MatrixXd A(60*60,60);
然后使用

A0=A.block(0*60,0);
...
A5=A.块(5*60,0);

如果您真的需要3D矩阵,那么就没有办法使用嵌套循环。对于60x60x60矩阵,您保留了216000个值,因此它的速度总是相对较慢。你想解决什么问题?也许有一种不用3D矩阵的方法可以解决这个问题。我正在计算一个特定时间步长的NxN矩阵,我需要存储每个瞬间的数据,以便在最后进行加权平均。我的问题更多的是关于
new
的使用-更准确地说,如果没有任何其他类型的数组(可能在boost库中)可以用于堆叠多个MatrixXd。
MatrixXd A(60*60,60);
A0 = A.block<60,60>(0*60,0);
...
A5 = A.block<60,60>(5*60,0);