Most efficient option for build 3D structures usin

2020-03-28 04:31发布

I need a 3D matrix/array structure on my code, and right now I'm relying on Eigen for both my matrices and vectors.

Right now I am creating a 3D structure using new:

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

and for acessing the values:

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

However, right now it is very slow in this part of the code, which makes me beleive that this might not be the most efficient way. Are there any alternatives?

3条回答
放我归山
2楼-- · 2020-03-28 05:04

While it was not available, when the question was asked, Eigen has been providing a Tensor module for a while now. It is still in an "unsupported" stage (meaning the API may change), but basic functionality should be mostly stable. The documentation is scattered here and here.

查看更多
▲ chillily
3楼-- · 2020-03-28 05:06

A solution I used is to form a fat matrix containing all the matrices you need stacked.

MatrixXd A(60*60,60);

and then access them with block operations

A0 = A.block<60,60>(0*60,0);
...
A5 = A.block<60,60>(5*60,0);
查看更多
手持菜刀,她持情操
4楼-- · 2020-03-28 05:08

An alternative is to create a very large chunk of memory ones, and maps Eigen matrices from it:

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

Map<MatrixXd> Mijk(data+60*(60*(60*k)+j)+i), 60, 60);

At this stage you can use Mijk like a MatrixXd object. However, since this not a MatrixXd type, if you want to pass it to a function, your function must either:

  • be of the form foo(Map<MatrixXd> mat)
  • be a template function: template<typename Der> void foo(const MatrixBase<Der>& mat)
  • take a Ref<MatrixXd> object which can handle both Map<> and Matrix<> objects without being a template function and without copies. (doc)
查看更多
登录 后发表回答