1

据我了解, 的接口Ceres要求将每个残差定义为一个函子,其中operator()是一个const 成员函数。这是我感兴趣的一个例子:

class some_residual
{
   public:
    template<typename type>
    bool operator()(const type* const some_params, type* residual) const;

    Eigen::MatrixXd m_M;/*The explanation follows. Nevermind its type, all
                          that matters is that it is not a raw buffer*/
};

现在,我在一个特殊情况下需要“帮助”矩阵m_M,我想在里面使用它operator()。有几个选项,例如,我可以将其声明为mutable Eigen::MatrixXd m_M;或将其更改为std::shared_ptr<Eigen::MatrixXd> m_pM;*mP从内部更新operator()(或者类似地,我可以使用引用)。作为另一种选择,我可以将此矩阵的数据作为原始 C 指针传递给,并在 优化operator()中修复它们。Ceres

我更愿意尽可能避免使用原始指针,而且我倾向于认为 usingmutable是最好的解决方案。一般来说,这是好的还是坏的做法,特别是,使用它是否安全Ceres?我还有什么其他选择?

4

1 回答 1

2

mutable 是个坏主意。

对 operator() 的调用是 const 的原因是,如果您决定在多个 CostFunctions 中使用相同的仿函数,或者在多个 ResidualBlocks 中使用相同的 CostFunction,那么如果 Ceres 使用多个线程来评估残差/雅可比派。

于 2018-04-22T21:26:32.190 回答