在本征中,如何将多个映射矩阵组合为矩阵数组

In Eigen, how to combine multiple mapped matrices as an array of matrices

本文关键字:映射 组合 数组      更新时间:2023-10-16

我有一个类,它有多个映射矩阵作为成员。代码如下所示:

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;
}

现在我想mat1mat2成为两个矩阵的数组,如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];
};

它显然不起作用,因为我无法在初始值设定项列表中执行此操作。但是要从容不迫地进行这种映射,我必须使用初始值设定项列表。有人对如何实现这一点有想法吗?

使用 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只是原始指针和维度的轻量级包装器。您可能希望将arrnrowncolnmat作为类成员,并动态构造Eigen::Map