Template Function mola::vision::levenbergMarquardt

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_jacobian that fills:

  • residuals r (N×1)

  • Jacobian J (N×D) given the current parameter vector x (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 retract callable 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);