2016-07-13 14 views
1

Ich habe eine Klasse, die mehrere zugeordnete Matrizen als Mitglieder hat. Der Code ist unten dargestellt:In Eigen, wie mehrere gemappte Matrizen als Array von Matrizen zu kombinieren

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

Jetzt habe ich mat1 und mat2 sein ein Array von zwei matrics, wie mat[0] und mat[1] machen will. Ich habe versucht, so etwas zu tun:

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

Es ist offensichtlich nicht funktioniert, da ich dies in der Initialisiererliste cant do. Aber um diese Art von Mapping mit Schritt zu machen, muss ich die Initialisierungsliste verwenden. Hat jemand eine Idee, wie man das umsetzt?

Antwort

0

Mit 11 C++ Sie können dies tun,

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

Es sollte in den folgenden Link Fall 5 der Liste der Initialisierung sein.

http://en.cppreference.com/w/cpp/language/list_initialization

Auf der anderen Seite, Eigen::Map ist nur eine leichte Wrapper auf die rohen Zeiger und Dimensionen. Sie können arr, nrow, ncol und nmat als Klassenmitglieder setzen und Eigen::Map on the fly konstruieren.

+0

Ich versuchte dies und bekam "' Fehler: schlechte Array-Initialisierer ". Könnte das ein Compiler-Problem sein? Ich benutze g ++ 4.4.7 mit dem Flag '-std = C++ 0x'. – Yang

+0

es ist zu alt. versuchen Sie mindestens 4.9 – kangshiyin

+0

danke, ich werde es einmal versuchen unser Computersystem administrative machen die neuere Version von 'gcc' heute verfügbar. Eine Folgefrage wäre, was wäre, wenn ich möchte, dass die Anzahl der Matrizen "nmat" anstelle von "2" ist? Gibt es eine Möglichkeit, eine For-Schleife in die Initialisierungsliste aufzunehmen? – Yang