levmar 优化库
levmar 是一个基于 C/C++ 实现的 Levenberg-Marquardt 非线性最小二乘算法的优化库。
Levenberg-Marquardt 算法
Gauss-Newton 算法是一个古老的处理非线性最小二乘问题的方法。该方法在迭代过程中要求矩阵 J(x) 满秩。为了克服这个困难,Levenberg(1944)提出了一种新的方法,但未受到重视。后来 Marquardt(1963)又重新提出,并在理论上进行了探讨,得到 Levenberg-Marquardt 方法,简称 LM 方法。在此基础上,Fletcher(1971)对其实现策略进行了改进,得到了 Levenberg-Marquardt-Fletcher 方法(LMF)。再后来,More(1978)将 LM 方法与信赖域方法结合,建立了带信赖域的 LM 方法。
LM 算法的产生主要是解决曲线最小二乘拟合问题,现在很多软件使用 LM 算法来解决通用的曲线拟合问题。
Download
- 从官网下载
levmar-2.6.tgz
: http://users.ics.forth.gr/~lourakis/levmar/levmar-2.6.tgz - 下载
levmar
的依赖库LAPACK
: http://www.netlib.org/clapack/clapack-3.2.1-CMAKE.tgz - 分别解压得到两个文件夹:
levmar-2.6
,clapack-3.2.1-CMAKE
Build
Build LAPACK
- 打开 CMake-Gui,
Where is the source code:
填clapack-3.2.1-CMAKE
文件夹, 并在该文件夹内新建BUILD
文件夹, 将Where to build the binaries:
填为该BUILD
文件夹. - 点击
Configure
, 配置Visual Studio 15 2017,x64,Use default native compilers
, 会有一些红色的 warning, 可直接忽略 - 点击
Generate
->Open Project
. - 可以将解决方案依次配置为
Debug\MinSizeRel\Release\RelWithDebInfo
, 然后生成解决方案. 也可以点击生成
->批生成
-> 勾选前四个ALL_BUILD
->生成
. - 在
BUILD
目录下生成了一系列库文件, 将其复制出来,后续将添加到levmar
库中
1 | [clapack-3.2.1-CMAKE\BUILD]\BLAS\SRC\Debug: blas.lib |
其中除了 Debug, 也可能生成了其他配置的对应库文件, 都可以复制到相应的文件夹中.
- 头文件
blaswrap.h,clapack.h,f2c.h
复制到 INCLUDE 文件夹中.
Build levmar
打开 CMake-Gui,
Where is the source code:
填levmar-2.6
文件夹, 并在该文件夹内新建build
文件夹, 将Where to build the binaries:
填为该build
文件夹.点击
Configure
, 配置Visual Studio 15 2017,x64,Use default native compilers
,将
LAPACKBLAS_DIR
的 Value 从默认的usr/lib
文件夹路径改成之前放置LAPACK
的 lib 库的路径.(levmar
也可以不依赖于lapack
进行编译, 只需将HAVE_LAPACK
取消勾选即可, 但部分功能将不可用)点击
Generate
->Open Project
.可以将解决方案依次配置为
Debug\MinSizeRel\Release\RelWithDebInfo
, 然后生成解决方案. 也可以点击生成
->批生成
-> 勾选前四个ALL_BUILD
->生成
.将解决方案下的
lmdemo
设置为启动项目,运行测试. 得到如下测试结果
1 | Covariance of the fit: |
- 在
BUILD
目录下生成了一系列库文件, 将其复制出来.
- RelWithDebInfo
- levmar.lib
- lmdemo.ilk
- lmdemo.pdb
- Debug
- xxx
- Release
- xxx
- MinSizeRel
- xxx
- 另外将几个头文件复制到
include
文件夹下:compiler.h, levmar.h, lm.h, misc.h
Reference
levmar 优化库