2013-02-19 3 views
9

Die documentation sagt:Wie konvertiert man Zeilenvektor in Spaltenvektor in Eigen?

... in Eigen, Vektoren nur ein Spezialfall von Matrizen sind, mit entweder 1 Zeile oder Spalte 1. Der Fall, in dem sie 1 Spalte haben, ist am häufigsten; Solche Vektoren werden als Spaltenvektoren bezeichnet, die oft nur als Vektoren abgekürzt werden. In dem anderen Fall, in dem sie 1 Zeile haben, werden sie Zeilenvektoren genannt.

jedoch dieses Programm gibt unintuitive Ergebnisse:

#include <eigen3/Eigen/Dense> 
#include <iostream> 

typedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector; 

int main(int argc, char** argv) 
{ 
    RowVector row(10); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
    row.transposeInPlace(); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
} 

Ausgang:

Rows: 1 
Columns: 10 
Rows: 1 
Columns: 10 

Ist das ein Bug, oder bin ich die Bibliothek falsch verwenden?

+2

ich eine Assertion zur Entwicklung hinzugefügt Zweig von Eigen, um sich davor zu schützen (miss) zu benutzen. –

Antwort

11

Die Dokumentation für transposeInPlace sagt:

Hinweis

, wenn die Matrix nicht quadratisch ist, dann *this eine veränderbare Matrix sein muss.

Sie werden Ihre Art benötigen sowohl dynamische Zeilen und Spalten zu haben:

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> 

Allerdings gibt es bereits eine typedef dafür: MatrixXd.

Alternativ, wenn Sie immer noch die Kompilierung-Größen möchten, können Sie tranpose verwenden, anstatt transposeInPlace Sie eine neue transponierte Matrix zu geben, anstatt ändern die aktuelle:

typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector; 
ColumnVector column = row.transpose(); 
+1

Danke! Das ist es –