2012-11-23 6 views
7

Recentemente ho iniziato a utilizzare la libreria . Ho avuto una domanda di mappare una matrice Eigen a un array C/C++. Una matrice Eigen è la colonna maggiore per impostazione predefinita. Quindi, se uso il seguente codice per mappare una matrice a una matrice C/C++,Mappare una matrice Eigen a un array C

double a[10]; 
double *p = &a[0]; 
MatrixXd(2,5) m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
cout<<m<<endl; 
Eigen::Map<MatrixXd>(p,2,5) = m; 
for (int i=0; i<10; i++) 
    cout<<a[i]<<" "; 
cout<<endl; 

Il risultato è:

0 1 2 3 4 
1 2 3 4 5 
0 1 1 2 2 3 3 4 4 5 

Se cambio la definizione di m come fila laureato:

Matrix <double,2,5,RowMajor> m; 

mi aspettavo l'output è simile al seguente:

0 1 2 3 4 
1 2 3 4 5 
0 1 2 3 4 1 2 3 4 5 

Ma in realtà il risultato era sempre lo stesso del primo. La mia domanda è che c'è un modo per mappare una matrice Eigen a un array C/C++ in modo che i dati dell'array siano basati su una riga?

ho trovato che posso usare la funzione memember matrix.data() per ottenere il risultato desiderato, ma mi chiedo se posso fare questo uso mappa:

Usa matrix.data() funziona:

double a[10]; 
double *p = &a[0]; 
Matrix <double,2,5,RowMajor> m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
double *p1 = m.data(); 
for (int i=0; i<10; i++) 
    cout<<p1[i]<<" "; 
cout<<endl; 

risposta

7

non è il tipo di matrice m che conta, ma il tipo utilizzato nel modello Map. È necessario modificare il tipo utilizzato nel modello Map come riga principale.

Eigen::Map<Matrix<double,2,5,RowMajor> >(p,2,5) = m; 
+0

Questo funziona. Grazie. – Rainfield