2016-07-13 111 views
1

我有一个具有多个映射矩阵作为成员的类。的代码如下所示:在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<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是两个MATRICS的阵列,如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]; 
}; 

它显然不工作,因为我不能在初始化程序列表中执行此操作。但要做这种跨步的映射,我必须使用初始化列表。任何人都有如何实现这个想法?

回答

0

用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

+0

我试过这个,并得到了“错误:错误的数组初始化器”。这可能是一个编译器问题?我使用带有标志'-std = C++ 0x'的g ++ 4.4.7。 – Yang

+0

它太旧了。试试至少4.9 – kangshiyin

+0

谢谢,我会试一试,一旦我们的计算机系统管理使得今天可以使用更新版本的'gcc'。后续的问题是,如果我想让矩阵的数量是'nmat'而不是'2',那该怎么办?有没有办法在初始化列表中引入'for'循环? – Yang