gpt4 book ai didi

c++ - 当列数固定时,Eigen::cannot convert Block to Ref

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:41 29 4
gpt4 key购买 nike

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

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

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

#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 版本确实有效,我认为这是由于 const 的 Ref 专门化,它重新创建了一个临时拷贝:

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

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

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;

有什么线索吗?

非常感谢!

最好的问候,

杰罗姆

最佳答案

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

尽管如此,最好还是将编译时 vector 保留为编译时 vector 。 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);

关于c++ - 当列数固定时,Eigen::cannot convert Block<Derived> to Ref<Derived>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962750/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com