据我了解,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
使用它是否安全?我还有其他什么选择?
答案 0 :(得分:1)
可变是一个坏主意。
调用operator()是const的原因是因为如果你决定在多个CostFunctions中使用相同的functor,或者在多个ResidualBlocks中使用相同的CostFunction,那么当Ceres使用多个线程时你就会面临竞争条件的风险评估残差/雅可比人。