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 использует несколько потоков для оценки остатков / якобианы.