How to convert row vector to column vector in Eigen?

Martin Drozdik picture Martin Drozdik · Feb 19, 2013 · Viewed 11k times · Source

The documentation says:

... in Eigen, vectors are just a special case of matrices, with either 1 row or 1 column. The case where they have 1 column is the most common; such vectors are called column-vectors, often abbreviated as just vectors. In the other case where they have 1 row, they are called row-vectors.

However this program outputs unintuitive results:

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

Output:

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

Is this a bug, or am I using the library incorrectly?

Answer

Joseph Mansfield picture Joseph Mansfield · Feb 19, 2013

The documentation for transposeInPlace says:

Note

if the matrix is not square, then *this must be a resizable matrix.

You'll need your type to have both dynamic rows and columns:

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

However, there's already a typedef for this: MatrixXd.

Alternatively, if you still want the compile-time sizes, you can use tranpose rather than transposeInPlace to give you a new transposed matrix rather than modify the current one:

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