Eigen C++非线性最小二乘法代码实现

最近在研究中需要使用LM等优化算法,对特定的东西进行优化。理论懂了一些些,论文也看了不少, 但是实际上手了两天却发现,自己根本写不出来,很多东西一知半解,现在还是要静下心,急不得啊

参考资料

#include <iostream>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
#include <opencv2/opencv.hpp>
#include <eigen3/Eigen/Cholesky>
#include <chrono>

/* 计时类 */
class Runtimer{
   
public:
    inline void start()
    {
   
        t_s_  = std::chrono::steady_clock::now();
    }
    
    inline void stop()
    {
   
        t_e_ = std::chrono::steady_clock::now();
    }
    
    inline double duration()
    {
   
        return std::chrono::duration_cast<std::chrono::duration<double>>(t_e_ - t_s_).count() * 1000.0;
    }
    
private:
    std::chrono::steady_clock::time_point t_s_; //start time ponit
    std::chrono::steady_clock::time_point t_e_; //stop time point
};

/*  优化方程 */
class LevenbergMarquardt{
   
public:
    LevenbergMarquardt(double* a, double* b, double* c):
    a_(a), b_(b), c_(c)
    {
   
        epsilon_1_ = 1e-6;
        epsilon_2_ = 1e-6;
        max_iter_ = 50; 	// 迭代次数
        is_out_ = true;
    }
    
    void setParameters(double epsilon_1, double epsilon_2, int max_iter, bool is_out)
    {
   
        epsilon_1_ = epsilon_1;
        epsilon_2_ = epsilon_2;
        max_iter_ = max_iter;
        is_out_ = is_out;
    }
    
    void addObservation(const double& x, const double& y)
    {
   
        obs_.push_back(Eigen::Vector2d(x, y));
    }
    
    void calcJ_fx() // 计算 Jacobi 矩阵
    {
   
        J_ .resize(obs_.size(), 3);
        fx_.resize(obs_.size()
  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值