当 Block 的模板 arg Row 等于 1 时,将 Eigen Block 分配给 Eigen Ref 编译错误

问题描述 投票:0回答:1

我写了一段代码:

  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 实现可能有一个模板规范

我的问题是:

如何绕过这个案例?

c++ templates eigen3
1个回答
0
投票

您遇到的问题是 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);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.