Eigen ::无法转换Block 参考 当cols数量固定时

问题描述 投票:2回答:2

我最近更新到最近的Eigen版本(3.3.90),看起来它破坏了我之前工作的东西(之前我使用的是libigl库附带的Eigen版本3.2.10)。

我想将块的结果存储到ref对象中,该对象将被传递并最终用于更新提取块的矩阵形式的内部。

一个不再编译的最小例子:

#include <Eigen/Dense>

int main(int argc, char *argv[])
{
  typedef Eigen::Matrix<bool, Eigen::Dynamic, 1> Mtype;
  typedef Eigen::Block<Mtype> Btype;
  typedef Eigen::Ref<Mtype> Rtype;
  Mtype m(2, 1);
  Btype bm = m.block(0, 0, 1, 1);
  Rtype rm = m; // OK
  Rtype rbm = bm; // Visual studio 2017 error C2440: 'initialisation' : impossible conversion
}

请注意,const版本确实有效,我认为这是由于Ref for const的特殊化,它重新创建了一个临时副本:

typedef Eigen::Ref<const Mtype> CRtype;
CRtype crbm = bm; // OK

类似地使用具有行数和列数的Matrix类型动态,也可以编译:

typedef Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic> Mtype;
typedef Eigen::Block<Mtype> Btype;
typedef Eigen::Ref<Mtype> Rtype;
Mtype m(2, 1);
Btype bm = m.block(0, 0, 1, 1);
Rtype rbm = bm;

有线索吗?

非常感谢!

最好的祝福,

杰罗姆

c++ compiler-errors eigen eigen3
2个回答
0
投票

Eigen版本3.3.90是一个开发分支,可能会破坏。使用最新的稳定版本(3.3.7)解决了这个问题。话虽这么说,您可以向Eigen开发人员提交错误报告,以确保注意到这一点(但是,当您这样做时,他们可能会看到这篇文章)。


2
投票

我以前的答案结论太快了。现在已修复:https://bitbucket.org/eigen/eigen/commits/cacb7b4ace39/

尽管如此,将编译时向量保持为编译时向量仍然更好。 Block<VectorXd>(和m.block(0, 0, 1, 0))会丢失此信息,因为它在运行时可能有1或0列,例如:

Block<VectorXd> bm = m.block(0, 0, 1, 0);

很好。所以在你的情况下,我仍然建议保留这些信息,例如:

auto bm = m.segment(0,1);
auto bm = m.block(0,0,1,fix<1>);       // fix is new in Eigen 3.4
auto bm = m.block<Dynamic,1>(0,0,1,1); // <3.4 version of the above cleaner line

这是一个典型的情况,你真的应该使用auto。您也可以直接初始化Ref,例如:

Ref<MType> rm = m.segment(0,1);
© www.soinside.com 2019 - 2024. All rights reserved.