首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当cols数固定时,不能将Block<Derived>转换为Ref<Derived>

当cols数固定时,不能将Block<Derived>转换为Ref<Derived>
EN

Stack Overflow用户
提问于 2019-03-02 20:37:09
回答 2查看 676关注 0票数 2

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

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

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

代码语言:javascript
复制
#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版本确实有效,我认为这是由于recreates的专门化,它重新创建了一个临时副本:

代码语言:javascript
复制
typedef Eigen::Ref<const Mtype> CRtype;
CRtype crbm = bm; // OK

类似地,使用具有行数和cols动态的矩阵类型,还编译:

代码语言:javascript
复制
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;

有什么线索吗?

非常感谢!

诚挚的问候,

杰罗姆

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-03 05:24:26

特征版本3.3.90是一个开发分支,那里的东西可能会被破坏。使用最新的稳定版本(3.3.7)解决了这个问题。话虽如此,您可以向Eigen提交一个bug报告,以确保这一点被注意到(尽管,当您这样做时,他们可能已经看到了这个帖子)。

票数 0
EN

Stack Overflow用户

发布于 2019-03-03 07:46:48

我先前的回答在结论上太快了。现在这是固定的:https://bitbucket.org/eigen/eigen/commits/cacb7b4ace39/

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

代码语言:javascript
复制
Block<VectorXd> bm = m.block(0, 0, 1, 0);

完全没问题。因此,就你的情况而言,我仍然建议保留这些信息,例如:

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
Ref<MType> rm = m.segment(0,1);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54962750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档