2015-11-12 25 views
5

Tôi có một ma trận, được đưa ra như:Eigen và std :: vector

std::vector<std::vector<std::complex<double>>> A; 

Và tôi muốn để lập bản đồ đó đến Eigen thư viện đại số tuyến tính như thế này:

Eigen::Map<Eigen::MatrixXcd, Eigen::RowMajor> mat(A.data(),51,51); 

Nhưng mã không thành công với

error: no matching function for call to   
‘Eigen::Map<Eigen::Matrix<std::complex<double>, -1, -1>, 1>:: 

Có cách nào để chuyển đổi vectơ của vectơ sao cho Eigen có thể sử dụng nó?

+1

Tại sao bạn sẽ có một vector của vector ở nơi đầu tiên? –

+0

Tôi nghĩ đây là cách dễ dàng để lưu trữ ma trận? Một cách tốt hơn là gì? – user1876942

Trả lời

11

Eigen sử dụng bộ nhớ liền kề, cũng như std::vector. Tuy nhiên, bên ngoài std::vector chứa một tập liền kề std::vector<std::complex<double> >, mỗi trỏ đến một tập các số phức khác (và có thể có độ dài khác nhau). Vì vậy, std "ma trận" không tiếp giáp. Những gì bạn có thể làm là sao chép dữ liệu vào ma trận Eigen, có nhiều cách để thực hiện điều đó. Cách đơn giản nhất sẽ là để lặp qua ij, với một lựa chọn tốt hơn là một cái gì đó giống như

Eigen::MatrixXcd mat(rows, cols); 
for(int i = 0; i < cols; i++) 
    mat.col(i) = Eigen::Map<Eigen::VectorXcd> (A[i].data(), rows); 
Các vấn đề liên quan