2016-07-13 112 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