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

Levmar使用小结相关推荐

  1. MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC

    查看全文 http://www.taodudu.cc/news/show-1217149.html 相关文章: PCL1.8.0+Windows+VS2013配置 正规方程的推导过程 (多变量线性回归 ...

  2. aarch64(ARMv8)交叉编译环境下载

    简介 在64位ubuntu14.04搭建交叉编译环境,去官网(www.linaro.org)下载解压,设置PATH路径即可 查看全文 http://www.taodudu.cc/news/show-1 ...

  3. 【阶段小结】协同开发——这学期的Git使用小结

    [阶段小结]协同开发--这学期的Git使用小结 一.Git简介 1. Git简单介绍 2. Git工作流程以及各个区域 3. Git文件状态变化 二.Git安装&Git基本配置 三.个人踩坑 ...

  4. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  5. php中$_REQUEST、$_POST、$_GET的区别和联系小结

    php中$_REQUEST.$_POST.$_GET的区别和联系小结 作者: 字体:[增加 减小] 类型:转载 php中有$_request与$_post.$_get用于接受表单数据,当时他们有何种区 ...

  6. c cin.get()的用法小结_c语言中static 用法

    static在c里面可以用来修饰变量,也可以用来修饰函数. 先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混. int a ; int ...

  7. linux 压缩文件夹格式,Linux下常见文件格式的压缩、解压小结

    Linux下常见文件格式的压缩.解压小结 .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ...

  8. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  9. flash 入门课知识小结

    一. 几种类型帧的小结:(关键帧.空白关键帧.普通帧) 1. 特点   帧--是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以 ...

最新文章

  1. mysql 如何将一个库的一个表的数据复制到另一个库中的一个表
  2. 第7周实践项目1.1 环形队列中用队尾和队的元素个数来实现队列的算法库
  3. Linux下V4L2捕捉画面+H264压缩视频+帧缓冲显示视频————H264压缩视频
  4. 美观又实用,10 款强大的开源 Javascript 图表库
  5. mysql传数据到微信小程序_微信小程序直播 数据同步与转存
  6. python 调用mysql存储过程返回结果集
  7. HTML5变化 (一)
  8. python 玩彩票程序 随机产生两位数与用户输入的相比较
  9. 一套功能强大的点云数据处理软件!
  10. DirectX截图黑屏的解决办法
  11. 苹果待处理订单要多久_苹果官网准备发货到发货要多久呀?
  12. 同账号下阿里云ecs克隆——通过镜像更换系统
  13. 欧派家居牵手用友云平台 打造标准化数据资产管理平台
  14. oracle-临时表
  15. EEPROM存储芯片24C02
  16. Meld Diff for windows 安装配置
  17. GAN动漫人像生成实现(附带源码)
  18. 【转】Java并发编程:并发容器之ConcurrentHashMap
  19. Neo4j图形数据库的一些基本Cypher查询指令总结
  20. Redis 之布隆过滤器,增强版,布谷鸟过滤器

热门文章

  1. Primefaces Spring和Hibernate集成示例教程
  2. Matlab策略模式
  3. SpringMVC 日期类型转换
  4. linux常用指令 查看端口占用情况
  5. 【模块化开发】之 模块化概述
  6. C#LeetCode刷题之#589-N叉树的前序遍历(N-ary Tree Preorder Traversal)
  7. 数据结构链表例程_如何掌握RxJava例程的四个结构
  8. 为什么我们删除Babel的舞台预设:实验性提案的明确选择加入
  9. 增强现实采用什么相机_从增强现实到情感检测:相机如何成为解读世界的最佳工具...
  10. mysql自动获取时间列_mysql自动获取时间日期的方法