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

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
设为两个矩阵的数组,如
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
只是原始指针和尺寸的轻量级包装。您可能希望将
arr
nrow
ncol
nmat
用作类成员,并即时构造
Eigen::Map