手寫系列之手寫高斯牛頓法 基於Eigen

2021-10-07 20:58:53 字數 3010 閱讀 6732

重複造輪子雖然很多人不推薦,但是個人認為,不重複造一下輪子,也就不能真正的懂輪子的寫作邏輯優點和考慮,更別說優化輪子.會導致像高中一聽就會,一做就錯的感覺,所以筆者挑選一下極具代表性的演算法進行手寫,收貨頗豐.

本**基於高翔博士#include

#include

#include

"opencv2/opencv.hpp"

#include

#include

using

namespace eigen;

using

namespace std;

using

namespace cv;

void

makethetestnum

(vector<

double

>

&xset ,vector<

double

>

&yset)

;void

gaussnewton

(const vector<

double

>

&xset ,

const vector<

double

>

&yset ,

double

&a,double

&b,double

&c);

intmain()

void

makethetestnum

(vector<

double

>

&xset ,vector<

double

>

&yset)

cout

size()

!= yset.

size()

) cout<<

"data is bad!"

<}void

gaussnewton

(const vector<

double

>

&xset ,

const vector<

double

>

&yset ,

double

&a,double

&b,double

&c)//使用eigen結算線性方程組

vector3d delta_abc = h.

ldlt()

.solve

(g);

//vector3d delta_abc = h.ldlt().solve(g);

//迭代的停止條件,模仿ceres

if(delta_abc.

norm()

<

1e-5

) cout<<

"delta_abc"

(delta_abc[0]

)||isnan

(delta_abc[1]

)||isnan

(delta_abc[2]

))// if(i>1 && cost >=lastcost)

lastcost = cost;

a += delta_abc[0]

; b +

= delta_abc[1]

; c +

= delta_abc[2]

; cout<<

"第"<"次:"

"a : "

"b : "

"c : "

"delta_abc"

<(flag)

else

}

cmake_minimum_required( version 2.8 )

project( guassnewton )

set( cmake_build_type "release"

)set( cmake_cxx_flags "-std=c++11 -o3"

)# eigen

find_package(eigen3 3.3 required)

include_directories($)

# opencv

find_package(opencv 3.1 required)

include_directories($)

add_executable( guassnewton gaussnewton.cc )

target_link_libraries(guassnewton $

)

第197次:

a :1.93561315

b :0.994692891

c :1.06252461

delta_abc1.

48018345

delta_abc 0.0661428147

0.000961872899

-0.0599845384

第198次:

a :2.00175596

b :0.995654764

c :1.00254007

delta_abc0.

0892969316

delta_abc-

0.00175240116

0.00433912412

-0.00253747612

第199次:

a :2.00000356

b :0.999993888

c :1.0000026

delta_abc0.

00532331598

已收斂,結果為:

final a :

2.00000356

final b :

0.999993888

final c :

1.0000026

手寫高斯牛頓法

cmake minimum required version 3.15 project guassnewton set cmake cxx standard 14 opencv find package opencv required include directories eigen includ...

手寫高斯牛頓曲線擬合(c

擬合曲線 取100個帶有高斯雜訊的數,利用高斯牛頓法進行擬合求取估計值 a b c 主要步驟 1.構造誤差項 2,求雅克比,以及cost 3,判斷cost是否小於上次cost,小 執行4,大 輸出結果 4,求h g 5求dx 6,更新估計量,到步驟2 高斯牛頓法練習 created by fangu...

Spring系列之手寫自定義的 Enable 註解

在我們日常開發普通的spring framework專案過程中 enable用的不是很多,但在springboot開發過程,我們經常會遇到 enable開始的好多註解,比如 enablewebmvc enableeurekaserver enableasync enablescheduling等,今...