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
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);
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:
foo(Map<MatrixXd> mat)
template<typename Der> void foo(const MatrixBase<Der>& mat)
Ref<MatrixXd>
object which can handle both Map<>
and Matrix<>
objects without being a template function and without copies. (doc)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.