【问题标题】:Eigen::Ref<> as a member variableEigen::Ref<> 作为成员变量
【发布时间】:2017-03-10 20:45:20
【问题描述】:

我需要一个类以将 Eigen::Ref 变量作为静态成员,该成员将通过 init 静态方法进行初始化。像这样的:

class CostFunction {
  public:
    static Eigen::Ref<Eigen::VectorXd> data;
    static void init(const Eigen::Ref<Eigen::VectorXd>& d) {
        data = d;
    }
    CostFunction() {}
};
int main() {
    Eigen::VectorXd data = Eigen::VectorXd::Random(30);
    CostFunction cf;
    cf.init(data);
    return 0;
}

这不会编译。我收到一个如下所示的错误:

/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘Eigen::RefBase<Derived>& Eigen::RefBase<Derived>::operator=(const Eigen::RefBase<Derived>&) [with Derived = Eigen::Ref<const Eigen::Matrix<double, -1, 1> >]’:                                                                                  
/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/Ref.h:229:77:   required from here                                                      
/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/util/Macros.h:608:26: error: use of deleted function ‘Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>& Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>::operator=(const Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>&)’                                                                                                                                                                             
     Base::operator=(other); \

一般来说,看起来一个 Eigen::Ref 不能分配给另一个 Eigen::Ref。 有谁知道为什么会有这个限制,是否有办法将 Ref 存储为类的静态成员变量?

PS:我使用 Eigen::Ref 是因为这里的文档:https://eigen.tuxfamily.org/dox-devel/classEigen_1_1Ref.html 听起来像是在实现适用于大多数 Eigen 类型的函数时使用的泛型类型的正确选择(例如,就我而言,在 VectorXd 和 Map 上)。

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

    在您的情况下,您最好使用VectorXd,否则您必须确保传递给init 的VectorXd 永远不会被破坏。

    在这里使用Ref 的唯一原因是允许使用例如Matrix 的列来初始化data,而无需任何副本。

    最后,如果你想重新分配一个Ref 来引用另一个缓冲区,那么使用placement new 来重新调用Ref 的构造函数。不要忘记先调用析构函数。

    【讨论】:

    • 感谢 ggael 的回答,新位置可以解决问题。此外,我必须将我的静态成员变量转换为指针以允许其初始化(没有 Ref 默认构造函数)。在这种情况下,不复制作为参数传递的 VectorXd 正是我的目标(在实际应用中它非常大)。如果 Ceres 使用经典的多态性,我会使用 shared_ptr (或类似的东西)作为我的变量类型,但它们的实现使这非常困难。如果您知道更好的方法来做我所追求的,请随时分享。再次感谢。
    • 除了偶尔我需要传递一个不能转换成 VectorXd 的 Map(而不是 VectorXd)。
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2011-09-29
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多