如何创建一个 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
您收到大小不匹配错误,因为您正试图在需要列向量的地方传递行向量。
有两种解决方案:
- 更改函数以接受行向量:
void foo3(Ref<RowVectorXf, 0, Eigen::InnerStride<> >){};
void foo4(Ref<RowVector3f, 0, Eigen::InnerStride<> >){};
- 显式转置传递给函数的向量:
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
我想在 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
您收到大小不匹配错误,因为您正试图在需要列向量的地方传递行向量。
有两种解决方案:
- 更改函数以接受行向量:
void foo3(Ref<RowVectorXf, 0, Eigen::InnerStride<> >){};
void foo4(Ref<RowVector3f, 0, Eigen::InnerStride<> >){};
- 显式转置传递给函数的向量:
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