2012-11-23 16 views
7

Son zamanlarda Eigen kitaplığını kullanmaya başladım. Bir Eigen matrisini bir C/C++ dizisine eşleme sorusu var. Özdeğer matrisi, varsayılan olarak sütundadır. Bu yüzdenBir Eigen Matrix'i bir C dizisine eşleştirin

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; 

çıkış, bir C/C++ dizi için bir matris eşleştirmek için aşağıdaki kodu kullanmak durumunda:

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

I m tanımını değiştirebilir ise satır ihtisas edilmiştir:

0 1 2 3 4 
1 2 3 4 5 
0 1 2 3 4 1 2 3 4 5 
:
Matrix <double,2,5,RowMajor> m; 

i çıktı şuna benzer beklenen 10

Ama sonuç aslında ilk olanla aynıydı. Sorum şu: Bir Eigen matrisini bir C/C++ dizisine eşlemek için bir yol var, böylece dizinin verisi satır tabanlı mı?

ben istenilen sonucu elde etmek için matrix.data() memember işlevini kullanabilirsiniz bulundu, ama bu kullanım haritasını yapıp yapamayacağını merak ediyorum:) (

Kullanım matrix.data çalışır:

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; 

cevap

7

önemli olan matrisin m türü, ama Map şablonda kullanılan tipim değil. Satırbaşı olmak için Map şablonunda kullanılan türü değiştirmeniz gerekir.

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

Bu, çalışır. Teşekkürler. – Rainfield

İlgili konular