在EIGEN中单独声明和初始化地图类型矩阵

时间:2016-07-12 13:30:47

标签: c++ eigen

我正在尝试使用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是其成员的类。

1 个答案:

答案 0 :(得分:1)

mat1mat2属于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运算符。