Template Function mola::vision::levenbergMarquardt
Defined in File lm_solver.h
Function Documentation
-
template<int D = Eigen::Dynamic>
LMResult mola::vision::levenbergMarquardt(Eigen::Matrix<float, D, 1> &x, const std::function<void(const Eigen::Matrix<float, D, 1> &x, Eigen::VectorXf &residuals, Eigen::Matrix<float, Eigen::Dynamic, D> &jacobian)> &cost_and_jacobian, const std::function<Eigen::Matrix<float, D, 1>(const Eigen::Matrix<float, D, 1> &x, const Eigen::Matrix<float, D, 1> &delta)> &retract, const LMConfig &cfg = {}) Generic Levenberg-Marquardt solver.
The problem is defined by a callable
cost_and_jacobianthat fills:residuals
r(N×1)Jacobian
J(N×D) given the current parameter vectorx(D×1).
The normal equations are: (JᵀJ + λ·diag(JᵀJ)) · Δx = -Jᵀr solved via Eigen LDLT.
Update: x ← x + Δx (caller handles manifold retractions if needed). The
retractcallable applies Δx to x and returns the new x; for Euclidean spaces, simply pass[](auto x, auto dx){ return x+dx; }.Template parameters: D = parameter dimension (use Eigen::Dynamic for runtime size)
// Example: minimize ‖Ax - b‖² Eigen::VectorXf x = Eigen::VectorXf::Zero(3); auto fun = [&](const Eigen::VectorXf& xv, Eigen::VectorXf& r, Eigen::MatrixXf& J) { r = A * xv - b; J = A; }; auto retract = [](const Eigen::VectorXf& x, const Eigen::VectorXf& dx) { return x + dx; }; auto result = levenbergMarquardt(x, fun, retract);