Ceres Solver學習筆記 1

2021-08-04 08:44:47 字數 2697 閱讀 8878

ceres-solver是google出的解決非線性最小二乘問題的庫,非線性最小二乘問題具有如下形式:

ρi(∥fi(xi1,…,xik)∥2)是我們所說的殘差,fi(⋅)在ceres中叫做costfunction,ρi(⋅)叫做lossfunction,用來剔除異常值影響。

ceres最簡單的應用,其他博主的部落格中已經有很好的說明,ceres-solver庫入門

這裡做乙個小的總結:

對於autodiffcostfunction型別的costfunction,我們構造乙個結構體,重寫template operator(),注意型別為模板型別,重新定義了()函式,將結構體作為autodiffcostfunction的引數。

// struct

struct costfunctor

};// make costfunction

costfunction* cost_function =

new autodiffcostfunction1, 1>(new costfunctor);

problem.addresidualblock(cost_function, null, &x);

對於numericdiffcostfunction型別的costfunction,與autodiffcostfunction類似,只不過將結構體的接收型別不再是模板型別,用double型別代替了模板型別。

// struct

struct numericdiffcostfunctor

};// make costfunction

costfunction* cost_function =

new numericdiffcostfunction1, 1>(

new numericdiffcostfunctor);

problem.addresidualblock(cost_function, null, &x);

在有些情況下,不使用autodiffcostfunction,例如我們用近似的方式計算導數,而不是用autodiff的鏈式法則,我們需要自己的殘差和jacobin計算。這時我們定義乙個costfunction或者sizedcostfunction的子類。

class quadraticcostfunction : public ceres::sizedcostfunction<1, 1>

virtual

bool evaluate(double

const* const* parameters,

double* residuals,

double** jacobians) const

return

true;

}};

******costfunction::evaluate 提供乙個 parameters 陣列作為輸入, 輸出 residuals 陣列作為殘差 ,輸出陣列 jacobians來顯示jacobians. jacobians是乙個可選項,evaluate檢查他是否為 non-null,如果非空,就用殘差方程的導數來填充他,因為殘差方程是線性的,所以jacobians是常數。(輸出慘差和jacobians怎麼用? 如何構建costfunction?)

對於有多個殘差的情況,我們可以構建多個autodiffcostfunction,例如

f1(x

)f2(

x)f3

(x)f

4(x)

f(x)

=x1+

10x2=

5‾√(

x3−x

4)=(

x2−2

x3)2

=10‾‾

‾√(x

1−x4

)2=[

f1(x

),f2

(x),

f3(x

),f4

(x)]

// struct 

/* struct f1 f2 f3 is omited */

struct f4

};// make costfunction

problem.addresidualblock(

new autodiffcostfunction1, 1, 1>(new f1), null, &x1, &x2);

problem.addresidualblock(

new autodiffcostfunction1, 1, 1>(new f2), null, &x3, &x4);

problem.addresidualblock(

new autodiffcostfunction1, 1, 1>(new f3), null, &x2, &x3)

problem.addresidualblock(

new autodiffcostfunction1, 1, 1>(new f4), null, &x1, &x4);

addresidualblock函式是乙個模板函式,模板引數為」costfunction,lossfunction,param1,param2,…」,lossfunction可以為null,表示不使用lossfunction,param最多有10個。

接下來會對ceres例程做一下學習。

Ceres Solver學習筆記 2

先從簡單的開始學習。1.繼承sizedcostfunction,構造costfunction include include ceres ceres.h include glog logging.h using ceres costfunction using ceres sizedcostfunc...

利用ceres solver解大規模線性方程組

在工程應用中,最後要求解的線性方程組往往是原來的殘差模型進行線性化後的誤差方程。通常情況下,模型的線性化由人工完成,而求解誤差方程則借助eigen等矩陣運算庫 參考1 來實現。現在,我們有了另一種選擇,那就是ceres solver。ceres是google公司用來解決非線性優化問題的開源庫,主要是...

學習筆記 雜湊學習筆記

hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...