如何创建一个 Eigen::Ref 到固定大小的矩阵行?

How to create an Eigen::Ref to a fixed-sized matrix row?

我想在 Eigen::Ref 文档 here 中写类似 foo4 类似于 foo3 的内容

#include <Eigen/Dense>

using namespace Eigen;

void foo3(Ref<VectorXf, 0, Eigen::InnerStride<> >){};
void foo4(Ref<Vector3f, 0, Eigen::InnerStride<> >){};

int main()
{
  Eigen::Matrix3f fmat = Eigen::Matrix3f::Identity();
  Eigen::MatrixXf dmat = Eigen::Matrix3f::Identity();

  foo3(dmat.row(1)); // OK

  foo3(fmat.row(1)); // Error : YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
  foo4(fmat.row(1)); // Error : YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
}

我正在使用 Eigen 版本 3.3.7

您收到大小不匹配错误,因为您正试图在需要列向量的地方传递行向量。

有两种解决方案:

  1. 更改函数以接受行向量:
void foo3(Ref<RowVectorXf, 0, Eigen::InnerStride<> >){};
void foo4(Ref<RowVector3f, 0, Eigen::InnerStride<> >){};
  1. 显式转置传递给函数的向量:
  foo3(fmat.row(1).transpose());
  foo4(fmat.row(1).transpose());

请注意,在某些情况下,Eigen 会隐式地将行向量转置为列向量(如下例所示)。但一般来说,我不会依赖它并且总是明确地转置向量以匹配方向:

Eigen::MatrixXd A(rows,cols);
Eigen::VectorXd v1 = A.row(0); // this works
Eigen::VectorXd v2 = A.row(0).transpose(); // more verbose, but what actually happens