gpt4 book ai didi

c++ - Ceres-Solver:剩余仿函数使用的可变变量是好的做法吗?还有什么其他选择?

转载 作者:行者123 更新时间:2023-11-30 03:24:09 26 4
gpt4 key购买 nike

据我了解,Ceres的接口(interface)要求将每个残差定义为一个仿函数,其中 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 一起使用是否安全? ?我还有哪些其他选择?

最佳答案

可变是个坏主意。

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

关于c++ - Ceres-Solver:剩余仿函数使用的可变变量是好的做法吗?还有什么其他选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com