2014-04-05 5 views
6

In MATLAB konvertiert die Zeile darunter eine Matrix in einen Vektor. Sie reduziert die Matrix spaltenweise in einen Vektor.Eigenkonvertierung der Matrix in Vektor

myvar(:) 

Wie mache ich das mit Eigen? Die Lösung sollte für jede Dimension von Matrix funktionieren.

MatrixXd A(3,2); 
VectorXd B(6); 
A << 1,2,3,4,5,6; 
B << A.col(0), A.col(1); 
//This isn't general enough to work on any size Matrix 
+0

myvar (:) nimmt eine Matrix ** Spalte ** weise ein nd platziert es in einen Vektor, nicht reihenweise. – rayryeng

+0

Ja Danke, ich habe meine Frage aktualisiert. – user3501255

Antwort

9

Eigen-Matrizen sind in der Spalte Großauftrag standardmäßig gespeichert, so können Sie verwenden einfach Eigen Karten verwenden, um die Daten Spalte für Spalte in einem Array zu speichern:

MatrixXd A(3,2); 
A << 1,2,3,4,5,6; 
VectorXd B(Map<VectorXd>(A.data(), A.cols()*A.rows())); 

Wenn Sie die Daten bestellt wollen Zeile für Zeile, Sie zuerst die Matrix transponieren müssen:

MatrixXd A(3,2); 
A << 1,2,3,4,5,6; 
A.transposeInPlace(); 
VectorXd B(Map<VectorXd>(A.data(), A.cols()*A.rows())); 
0

Ein anderer Weg, es zu tun ist:

oder, wenn Sie den Vektor in Reihe Reihenfolge wollen:

... 
VectorXd B = A.transpose(); 
B.resize(B.cols()*B.rows(), 1); 

Grüße.

+1

Das Zuweisen einer 'Matrix' zu einem 'Vector' ist fehlgeschlagen. – YvesgereY

1

Wenn Sie die Matrixwerte wollen ändern, ohne dass eine neue Variable zu definieren, können Sie

Eigen::MatrixXd A(2,3); 
A.data()[3] = 1.2 

in diesem Fall Daten() verwenden, [3], um Index A entsprechen wird [1,1] der Matrix oder lesen sie durch

double value = A.data()[5]; 

so, wenn ich die ganze 2by3 Matrix aufschreiben, es wäre wie

A.data()[0]  A.data()[2] A.data()[4] 
A.data()[1]  A.data()[3] A.data()[5]