Eigen::Ref<> 作为成员变量

Eigen::Ref<> as a member variable

我需要一个 class 来拥有一个 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 存储为 class 的静态成员变量?

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

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

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

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