2016-07-12 10 views
0

eine Mapping-Matrix separat deklarieren und initialisieren. Ich versuche, Eigen: Map mit Stride zu verwenden, um zwei Matrizen einem Array zuzuordnen. wennIn EIGEN

Zum Beispiel
arr = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24} 

ich die abgebildeten Matrizen wollen

mat1 = {1, 7, 13, 19; 
     3, 9, 15, 21; 
     5, 11, 17, 23} 

und

mat2 = {2, 8, 14, 20; 
     4, 10, 16, 22; 
     6, 12, 18, 24} 

Der folgende Code zu arbeiten:

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. 

int *arr = new int[arr_size]; 

Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1(arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2(arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 

for (int i=0; i<arr_size; i++) { 
    arr[i] = i+1; 
} 

cout <<"mat1 = \n"<<mat1<<endl; 
cout <<"mat2 = \n"<<mat2<<endl; 

Die Ergebnisse sind:

mat1 = 
1 7 13 19 
3 9 15 21 
5 11 17 23 
mat2 = 
2 8 14 20 
4 10 16 22 
6 12 18 24 

Allerdings würde Ich mag die Matrizen separat wie dem folgenden Code deklarieren und Karte:

MatrixXi mat1; 
MatrixXi mat2; 
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 
new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 

Das bin ich Fehler Segmentation geben.

Wenn ich mat2 wie den Code unten auf Kommentar:

MatrixXi mat1; 
// MatrixXi mat2; 
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 
// new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat)); 

Dann gibt es keine Segmentation fault, aber die Stride nicht funktioniert. Die Ergebnisse sind:

mat1 = 
1 4 7 10 
2 5 8 11 
3 6 9 12 

Der Grund, warum ich die Deklaration und Initialisierung trennen wollen, ist, dass ich eine Klasse schreiben wollen, die mat1 und mat2 Mitglieder davon sind.

Antwort

1

Sie mat1 und mat2 sind vom Typ Map<MatrixXi, 0, Stride<Dynamic, Dynamic> >, aber wenn man es separat tun, Sie definiert sie als MatrixXi.

Wenn Sie sie als ein Klassenmitglied möchten, können Sie dem allgemeinen Weg für ein Klassenmitgliedsobjekt folgen.

class MyClass { 
    MyClass(int* arr, int nrow, int ncol, int nmat) : 
     a(3), v(10), 
     mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)), 
     mat2(arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) { 
    } 

    int a; 
    std::vector<int> v; 
    Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1; 
    Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2; 
}; 

Der Operator new wird nicht benötigt.

+0

OK für die Deklaration, aber Sie müssen mat1, mat2 mithilfe der Initialisiererliste entweder mit dem richtigen Argument initialisieren, und falls nicht möglich (weil die Parameter noch nicht bekannt sind), initialisieren Sie sie mit Dummy-Parametern (0) und verwenden Sie inplace Neu, um sie neu zu initialisieren. – ggael

+0

@ggael Ich habe das vermisst. initialisieren Liste wird besser sein. – kangshiyin

+0

@kangshiyin Danke, das ist sehr hilfreich! – Yang