eine Mapping-Matrix separat deklarieren und initialisieren. Ich versuche, Eigen: Map mit Stride zu verwenden, um zwei Matrizen einem Array zuzuordnen. wennIn EIGEN
Zum Beispielarr = {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.
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
@ggael Ich habe das vermisst. initialisieren Liste wird besser sein. – kangshiyin
@kangshiyin Danke, das ist sehr hilfreich! – Yang