我正在尝试使用Eigen:Map和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));


则没有分段错误,但跨步不起作用。结果是:

mat1 =
1  4  7 10
2  5  8 11
3  6  9 12


我想分开声明和初始化的原因是我想编写一个mat1和mat2是它的成员的类。

最佳答案

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

关于c++ - 在EIGEN中分别声明和初始化 map 类型矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38330345/

10-11 22:50
查看更多