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 ответ

Изменчивый это плохая идея.

Причина, по которой оператор operator() является константой, заключается в том, что если вы решите использовать один и тот же функтор в нескольких CostFunctions или одну и ту же CostFunction в нескольких ResidualBlocks, то вы рискуете получить условия гонки, если и когда Ceres использует несколько потоков для оценки остатков / якобианы.

Другие вопросы по тегам