1. 程式人生 > >Levmar使用小結1

Levmar使用小結1

   Levmar是非線性優化的一個庫,使用起來很方便。但是剛開始接觸時會有點頭疼,尤其是如果不懂LM演算法,直接使用的話,就會滿腦子“這是啥?這都是啥?”  最近在學習非線性優化的方法,總結一下希望可以幫助到大家。Levmar的安裝配置大家可以看這篇文章:http://blog.sina.com.cn/s/blog_45b747f70101he1t.html

    Levmar的官網是這個:http://users.ics.forth.gr/~lourakis/levmar/index.html   其實學習任何一種工具最好的方法還是看原版資料,六級以上的英語基本都能看懂的。

        從那篇安裝的文章,我們可以看出,Levmar依賴於一個叫LAPACK的庫,這個庫是Fortran語言編寫的,可用於解多元線性方程式、計算特徵向量、計算矩陣的QR分解,奇異值分解等等。事實上,Levmar不依賴於這個庫也是可以的。Levmar包含多個函式,如下圖所示:

      這些函式中,前4個是無約束的優化,後面的是有約束的優化,函式的名字也很容易理解。Levmar提供了兩種版本的精度,雙精度(函式名字首字母為d, double)和單精度(函式名字首字母為s, single)。Levmar支援有約束的非線性最小二乘問題,包括linear equation constraints(第5-8個函式),box constraints(第9-12個函式),box & linear equation constraints(第13-16個函式),box, linear equation & inequality constraints(第17-20個函式),從函式名的中間字母,可以區分出這些函式。在非線性優化中,需要計算Jacobian矩陣,有的有解析形式的Jacobian矩陣,使用der字尾的函式;有的沒有解析形式的Jacobian矩陣,使用有限差分方法來近似,使用dif字尾的函式。最後提到的Convenience wrappers,x開頭的幾個函式我不是很瞭解,這裡不討論。 綜上,Levmar是比較全面的非線性優化演算法。

      實際上,並不是所有的函式都依賴LAPACK庫,其中dlevmar_der(),dlevmar_dif(),slevmar_der(),slevmar_dif(),dlevmar_bc_der(),dlevmar_bc_dif(),slevmar_bc_der(),slevmar_bc_dif()是不需要依賴這個庫的,其他的需要。

    下載好Levmar檔案解壓縮後(我用的2.6版本),裡面有個matlab資料夾,這是Levmar的Matlab版本,這裡不做討論,其餘的就是C檔案,建議大家先讀一下README.txt,有助於大家對這個庫的理解。

    開啟levmar.h檔案,程式碼開始後首先有一段配置選項,如下圖所示:

        這段程式碼就是用來設定一些選項,第一個就是LAPACK庫的設定,如果不想依賴這個庫,就將 #define HAVE_LAPACK 註釋掉,當然,註釋掉後需要用到這個庫的那些函式就不能用了。接下來的一長段我不是特別理解,保持預設狀態就行。後面是單精度和雙精度的設定,如果註釋掉 #define LM_DBL_PREC ,所有的雙精度函式都不能用(即d開頭的函式),同理,如果註釋掉 #define LM_SNGL_PREC,所有的單精度函式都不能用(即s開頭的函式)。當然也可以保持預設狀態,即都不註釋。這些可以根據實際需要來配置。

          另外有一點需要注意,如果不使用Cmake編譯,而是直接用Visual c++編譯,在解壓縮後的Levmar資料夾裡,有一些字尾是core的C檔案(*_core.c),這些檔案是不能直接編譯的,即不需要新增到Visual c++ 的工程裡。

           這裡所說的基本上在 README.txt 檔案裡都有說明。我們的工程需要非線性優化,用到了dlevmar_dif()函式,原來以為必須依賴LAPACK庫,這樣的話就沒辦法做嵌入式,後來才發現這個LAPACK庫可以不依賴的,這樣的話就方便很多。希望這篇文章可以幫到大家。
轉:https://blog.csdn.net/hhh0209/article/details/51375169