16

ドキュメントには次のように書かれています。

... 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

これはバグですか、それともライブラリを誤って使用していますか?

4

1 に答える 1

14

のドキュメントは次のようにtransposeInPlace述べています。

ノート

行列が正方形でない場合は*this、サイズ変更可能な行列である必要があります。

動的な行と列の両方を持つタイプが必要になります。

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

ただし、これにはすでにがありtypedefますMatrixXd

または、コンパイル時のサイズが必要な場合は、現在の行列を変更するのではなく、新しい転置行列を提供するのtranposeではなく、を使用できます。transposeInPlace

typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;
ColumnVector column = row.transpose();
于 2013-02-19T10:23:46.600 に答える