2013-02-19 17 views
9

documentationと言う:Eigenの列ベクトルを列ベクトルに変換するには?

...固有に、ベクターは、1行または1列のいずれかで、 行列のちょうど特殊なケースです。彼らが1 列を持つ場合が最も一般的です。このようなベクトルは列ベクトルと呼ばれ、 はしばしば単にベクトルと略される。それらが1 の行を持つ他のケースでは、行ベクトルと呼ばれます。

しかし、このプログラムの出力非直観的な結果:

#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; 
} 

出力:

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

これはバグですか、私は間違ってライブラリを使用していますか?

+2

私が開発にアサートを追加しましたこの(誤った)使用に対して警戒するためにEigenの支店。 –

答えて

11

transposeInPlaceのドキュメントは言う:

を行列が正方形でない場合は、その後、*thisはサイズ変更可能な行列でなければなりません。

あなたは、動的な行と列の両方を持っているあなたのタイプが必要になります:

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

しかし、このためtypedefはすでにあります:MatrixXd

それでもコンパイル時のサイズが必要な場合は別の方法として、あなたはあなたに新しい転置行列を与えるのではなく、現在の1を変更することではなくtransposeInPlaceよりもtranposeを使用することができます。

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

ありがとうございます!これだよ –

関連する問題