Eigen的非线性求解LevenbergMarquardt

#ifndef Optimization_HEADER
#define Optimization_HEADER
#endif
#pragma once

#include <Eigen/Eigen>
#include <unsupported/Eigen/NonLinearOptimization>
#include "../math/vector.h"

template <class T>
class CostFunction {

public:
    using Scalar = typename T::Scalar ;
    
    static constexpr auto InputsAtCompileTime = Eigen::Dynamic ;
	static constexpr auto ValuesAtCompileTime = Eigen::Dynamic ;
    using InputType = Eigen::Matrix<Scalar ,InputsAtCompileTime ,1> ;
	using ValueType = Eigen::Matrix<Scalar ,ValuesAtCompileTime ,1> ;
	using JacobianType = Eigen::Matrix<Scalar ,ValuesAtCompileTime ,InputsAtCompileTime> ;

private:
    T &mSolver ;

public:
    CostFunction () = delete ; 

    explicit CostFunction (T &solver) :
         mSolver (solver) {}

    int inputs () const {
        return mSolver.inputs () ;
    }
    
    int values () const {
        return mSolver.values () ;
    }

    inline int operator() (const Eigen::Matrix<Scalar ,Eigen::Dynamic ,1> &param ,Eigen::Matrix<Scalar ,Eigen::Dynamic ,1> &residual) const {
		mSolver.cost_function (param ,residual) ;
		return 0 ;
	}
};


class OptimizerSolver  {
public:
    using Scalar = double ;
private:
    
    friend CostFunction<OptimizerSolver> ;
    const std::vector<math::Vec3d>& mPoints ;
    Eigen::VectorXd& mParameters ;

    Eigen::Matrix<Scalar ,Eigen::Dynamic ,1> mOptimizingParam ;
	Eigen::DenseIndex mDenseIndex ;

public:
    OptimizerSolver () = delete ;

    explicit OptimizerSolver (const std::vector<math::Vec3d>&points ,
                              Eigen::VectorXd& parameter )
                              : mPoints (points) ,
                                mParameters (parameter) {}
    /*需要优化的参数个数*/
    int inputs () const {
        return 6 ;
    }

    /*cost function 的项数*/
    int values () const {
        return 100 ;
    }

    /** 优化方程 costfunction
     *  param1 param 需要优化的参数
     *  param2 residual cost function的每一项
    */
    void cost_function (const Eigen::VectorXd& param , Eigen::VectorXd& residual ) const {
   
        const auto r1x = decode_param (param) ;
        for (int i = 0 ; i < 100 ; i++) {
            // residual[i] = cost function的每一项 ;
        }
        
    }

    /*执行优化*/
    inline void operator() () {
		mOptimizingParam = encode_param (mParameters) ;
		mDenseIndex = Eigen::DenseIndex () ;
		const auto r1x = CostFunction<OptimizerSolver> (*this) ;
		const auto r2x = Eigen::LevenbergMarquardt<const CostFunction<OptimizerSolver> ,Scalar>::lmdif1 (r1x ,mOptimizingParam ,&mDenseIndex) ;
        assert(r2x > 0 ) ;
        const auto r3x = decode_param (mOptimizingParam) ;
        mParameters = r3x.row(0) ; // 更新参数
	}

private:
    /** 把需要优化的参数变成向量
    */
    static Eigen::VectorXd encode_param (const Eigen::VectorXd& parameter) {
        Eigen::VectorXd ret (6) ;
        
        return ret ;
    }

    /** 把之前编码成向量的参数变回原来的参数模式
    */
    static Eigen::MatrixXd decode_param (const Eigen::VectorXd& param) {
        Eigen::MatrixXd ret (2 ,4) ;

        return ret ;
    }
};

最近要使用Eigen优化非线性方程的总结.具体的代码就不贴出来了,只贴出使用的框架
使用的话就直接创建OptimizerSolver类 然后调用()方法就可以了

参考:https://blog.csdn.net/u012541187/article/details/53220280

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值