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 优化库