Ceres-Solver:是一个可变的残余函子用于良好的实践吗?还有什么其他选择?

时间:2018-04-20 09:49:08

标签: c++ computer-vision mutable ceres-solver

据我了解,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优化。

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

1 个答案:

答案 0 :(得分:1)

可变是一个坏主意。

调用operator()是const的原因是因为如果你决定在多个CostFunctions中使用相同的functor,或者在多个ResidualBlocks中使用相同的CostFunction,那么当Ceres使用多个线程时你就会面临竞争条件的风险评估残差/雅可比人。