2012-11-23 40 views
7

Gần đây tôi đã bắt đầu sử dụng thư viện Eigen. Tôi có một câu hỏi về ánh xạ một ma trận Eigen tới một mảng C/C++. Một ma trận Eigen là cột chuyên ngành theo mặc định. Vì vậy, nếu tôi sử dụng đoạn mã sau để ánh xạ một ma trận để một/C++ mảng C,Ánh xạ Ma trận Eigen tới một mảng 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; 

Đầu ra là:

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

Nếu tôi thay đổi định nghĩa của m là hàng chuyên ngành:

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

tôi dự kiến ​​sản lượng sẽ như thế này:

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

Nhưng thực tế kết quả vẫn giống như kết quả đầu tiên. Câu hỏi của tôi là có cách nào để ánh xạ một ma trận Eigen vào một mảng C/C++ sao cho dữ liệu của mảng là hàng dựa?

tôi thấy rằng tôi có thể sử dụng matrix.data() chức năng memember để có được kết quả mong muốn, nhưng tôi tự hỏi liệu tôi có thể làm sử dụng bản đồ này:

Sử dụng matrix.data() hoạt động:

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; 

Trả lời

7

Nó không phải là loại ma trận m quan trọng, nhưng loại được sử dụng trong mẫu Map. Bạn phải thay đổi loại được sử dụng trong mẫu Map thành hàng chính.

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

Tác phẩm này. Cảm ơn. – Rainfield

Các vấn đề liên quan