我正在尝试使用Eigen:Map with Stride将两个矩阵映射到一个数组。例如,如果
arr = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24}
我希望映射的矩阵是
mat1 = {1, 7, 13, 19;
3, 9, 15, 21;
5, 11, 17, 23}
和
mat2 = {2, 8, 14, 20;
4, 10, 16, 22;
6, 12, 18, 24}
以下代码有效:
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.
int *arr = new int[arr_size];
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1(arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2(arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
for (int i=0; i<arr_size; i++) {
arr[i] = i+1;
}
cout <<"mat1 = \n"<<mat1<<endl;
cout <<"mat2 = \n"<<mat2<<endl;
结果是:
mat1 =
1 7 13 19
3 9 15 21
5 11 17 23
mat2 =
2 8 14 20
4 10 16 22
6 12 18 24
但是,我想像下面的代码一样单独声明和映射矩阵:
MatrixXi mat1;
MatrixXi mat2;
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
这会给我分段错误。
如果我像下面的代码一样注释掉mat2:
MatrixXi mat1;
// MatrixXi mat2;
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
// new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
然后没有分段错误,但Stride不起作用。结果是:
mat1 =
1 4 7 10
2 5 8 11
3 6 9 12
我想分离声明和初始化的原因是我想编写一个mat1和mat2是其成员的类。
答案 0 :(得分:1)
您mat1
和mat2
属于Map<MatrixXi, 0, Stride<Dynamic, Dynamic> >
类型,但当您单独执行此操作时,您将其定义为MatrixXi
。
如果您希望它们作为类成员,您可以按照类成员对象的一般方式进行操作。
class MyClass {
MyClass(int* arr, int nrow, int ncol, int nmat) :
a(3), v(10),
mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat2(arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {
}
int a;
std::vector<int> v;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2;
};
不需要new
运算符。