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

C++ 在特征矩阵中,如何将多个映射矩阵组合为矩阵数组,c++,eigen,C++,Eigen,我有一个类,它有多个映射矩阵作为成员。代码如下所示: 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<Dyn

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

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

它显然不起作用,因为我不能在初始值设定项列表中这样做。但要使用stride进行这种映射,我必须使用初始值设定项list。有人知道如何实现这一点吗?

使用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];
};
class-MyClass{
公众:
MyClass(int*arr、int nrow、int ncol、int nmat):
mat{{arr,nrow,ncol,Stride(nrow*nmat,nmat)},
{arr+1,nrow,ncol,Stride(nrow*nmat,nmat)}{

std::我是否可以尝试此操作并得到“
错误:错误的数组初始值设定项”
。这可能是编译器的问题吗?我使用的g++4.4.7带有标志
-std=c++0x
。它太旧了。请至少尝试4.9次。谢谢,一旦我们的计算机系统管理员今天发布了较新版本的
gcc
,我就会尝试。接下来的问题是,如果我希望矩阵的数量为
nmat
,而不是
 2
?有没有办法在初始值设定项列表中为
循环引入一个
?没有办法。动态构建映射会更好。我已经使用gcc 4.9.2对它进行了测试,它正在工作。谢谢!
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];
};