我需要在我的代码上使用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);
//...
}
}
}
但是,现在这段代码的速度非常慢,这让我觉得这可能不是最有效的方法。还有其他选择吗?
答案 0 :(得分:2)
答案 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)