我有一个具有多个映射矩阵作为成员的类。代码如下所示:
class MyClass {
public:
MyClass(int nrow, int ncol, int nmat) :
arr(new int [nmat*nrow*ncol]),
mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat2(arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {}
int *arr;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2;
};
int main()
{
int nmat = 2; // number of matrices
int nrow = 3; // number of rows for each matrix
int ncol = 4; // number of columns for each matrix
int arr_size = nmat*nrow*ncol; // size of the array.
MyClass A (nrow, ncol, nmat);
for (int i=0; i<arr_size; i++) {
A.arr[i] = i+1;
}
cout <<"mat1 = \n"<<A.mat1<<endl;
cout <<"mat2 = \n"<<A.mat2<<endl;
return 0;
}
现在我想让mat1
和mat2
成为两个matrics的数组,mat[0]
和mat[1]
。我试图做这样的事情:
class MyClass {
public:
MyClass(int nrow, int ncol, int nmat) :
arr(new int [nmat*nrow*ncol]),
mat[0](arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat[1](arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {}
int *arr;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat[2];
};
它显然不起作用,因为我无法在初始化列表中执行此操作。但要用步幅做这种映射,我必须使用初始化列表。任何人都知道如何实现这个?
答案 0 :(得分:0)
使用C ++ 11,您可以执行此操作
class MyClass {
public:
MyClass(int* arr, int nrow, int ncol, int nmat) :
mat { { arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) },
{ arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) } } {
std::cout << mat[1].data() - arr << std::endl;
std::cout << mat[1].rows() << std::endl;
std::cout << mat[1].cols() << std::endl;
std::cout << mat[1].innerStride() << std::endl;
std::cout << mat[1].outerStride() << std::endl;
}
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat[2];
};
以下链接中应该是列表初始化的情况5。
http://en.cppreference.com/w/cpp/language/list_initialization
另一方面,Eigen::Map
只是原始指针和尺寸的轻量级包装。您可能希望将arr
,nrow
,ncol
和nmat
作为类成员并动态构建Eigen::Map
。