我写了一段代码:
Eigen::Matrix<float, 5, Dynamic> m(5, 5);
auto r = m.topRows<1>();
Eigen::Ref<Eigen::Matrix<float, 1, Dynamic>> r2(r)
这会导致编译错误:
error: no matching function for call to ‘Eigen::Ref<Eigen::Matrix<float, 1, -1> >::Ref(Eigen::Block<Eigen::Matrix<float, 5, -1>, 1, -1, false>&)’
46 | Eigen::Ref<Eigen::Matrix<float, 1, Dynamic>> r2(r);
但是当我将代码更改为:
Eigen::Matrix<float, 5, Dynamic> m(5, 5);
auto r = m.topRows<2>();
Eigen::Ref<Eigen::Matrix<float, 2, Dynamic>> r2(r)
一切都好。
我发现当 template arg row == 1 时,eigen src 中的 block 实现可能有一个模板规范
我的问题是:
如何绕过这个案例?
您遇到的问题是 Eigen 将编译时一维等于 1 的矩阵视为向量 (
IsVectorAtCompileTime==true
)。因此,(列主)矩阵的顶行实际上就像一个具有内部步长的向量(等于原始矩阵的行数)。
您可以制作矩阵和
Ref
的行主,
Eigen::Matrix<float, 5, Eigen::Dynamic, Eigen::RowMajor> m(5,5);
auto r = m.topRows<1>();
Eigen::Ref<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor> > r2(r);
或者你需要允许
Ref
有一个动态的内部步幅,如果它只有一行:
Eigen::Matrix<float, 5, Eigen::Dynamic> m(5,5);
auto r = m.topRows<1>();
Ref<Eigen::Matrix<float, 1, Eigen::Dynamic>, Eigen::InnerStride<> > r2(r);
您可以为后者定义一个别名,例如,
template<class Scalar, int Rows, int Cols, int Options=0>
using BlockRef = Eigen::Ref<Eigen::Matrix<Scalar, Rows, Cols>, Options,
typename Eigen::internal::conditional<Rows==1,Eigen::InnerStride<>,Eigen::OuterStride<> >::type>;
然后像这样使用它:
BlockRef<float, 1, Eigen::Dynamic> r3(r);