2015-11-12 17 views
5

Ho una matrice, che è dato come:Eigen e std :: vector

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

E voglio mappare che alla biblioteca Eigen Algebra lineare come questo:

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

Ma la codice non riesce con

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

esiste un modo per convertire un vettore di un vettore in modo che Eigen può usarlo?

+1

Perché si avrebbe un vettore di vettori, in primo luogo? –

+0

Ho pensato che fosse un modo semplice per memorizzare una matrice? Qual è un modo migliore? – user1876942

risposta

11

Eigen utilizza memoria contigua, così come std::vector. Tuttavia, l'esterno std::vector contiene un insieme contiguo di std::vector<std::complex<double> >, ognuno dei quali punta a un diverso insieme di numeri complessi (e può avere lunghezze diverse). Pertanto, la "matrice" standard non è contigua. Quello che puoi fare è copiare i dati nella matrice Eigen, ci sono diversi modi per farlo. La più semplice sarebbe quella di un ciclo su i e j, con una scelta migliore di essere qualcosa di simile a

Eigen::MatrixXcd mat(rows, cols); 
for(int i = 0; i < cols; i++) 
    mat.col(i) = Eigen::Map<Eigen::VectorXcd> (A[i].data(), rows);