如何在Eigen中将行向量转换为列向量?

Mar*_*dik 12 c++ eigen

该文件说:

...在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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Rows: 1
Columns: 10
Rows: 1
Columns: 10
Run Code Online (Sandbox Code Playgroud)

这是一个错误,还是我错误地使用了库?

Jos*_*eld 12

文档transposeInPlace说:

注意

如果矩阵不是正方形,则*this必须是可调整大小的矩阵.

您需要您的类型同时拥有动态行和列:

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
Run Code Online (Sandbox Code Playgroud)

但是,已经存在typedef这样的问题:MatrixXd.

或者,如果您仍然需要编译时大小,则可以使用tranpose而不是transposeInPlace为您提供新的转置矩阵,而不是修改当前的矩阵:

typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;
ColumnVector column = row.transpose();
Run Code Online (Sandbox Code Playgroud)