最小二乘法拟合一些基本空间元素的C#实现 —— (零)前言和参考资料

写这些(为了避免单个过长)文章的目的有两个,一是记录下最近工作的过程和参考的档案,避免以后忘记。二是万一有人和我有一样的问题,也许能搜到这篇文章,避免像我一样走这么多的歪路。

最近半因为工作,半因为兴趣,想实现一些笛卡尔三维坐标内的点云拟合基本元素(直线、平面、圆柱等),虽然很多软件都有非常强的功能,但是基本上都是重量级的收费工业软件,我买不起,而像我们公司的虽然我不用付费,API又几乎没有,所以也借这个机会来学习一下。

先要吐一下槽,中文的资料几乎找不到,不是一些算法课的作业和解答,就是论文数据库中付费才能看,而且不知道质量好坏的论文。不过也是这些论文拯救了我,虽然论文不免费,但是参考文档直接列在那,看参考文档往往比看这些翻译+“优化”的论文要好。

另外一个比较有用的工具是google 学术搜索,可以看到一个论文被引用的次数,后面附的一篇论文被引用了150多次,基本上是这个话题里最早的几篇论文,也是讲的最基础的论文。

另外还要感谢维基百科,一些基本已经忘记的数学概念都是通过这个想起来的,还可以当专业词典用,一篇文章切换中英文,可以极大的帮助理解。

以下是参考资料,会不断更新。

C#类:

math.net库是一个C#实现的数值计算库,在算法实现中大量实用了这个库提供的线代矩阵操作。如果使用C++,一个更有名的库是boost

msdn有任何问题和错误来msdn肯定能查到,比csdn要靠谱太多了。

stackoverflow无数次把我从绝望深渊拯救上来的人,什么问题都可以问,什么问题都有人问,几乎都会得到正确的解释和参考信息。

算法及原理类:

使用Math.NET进行线性与非线性最小二乘拟合,我最早找到的文章之一,我几乎以为单凭这篇文章就可以帮助我搞定问题。
这篇文章的优点是罗列了从基本到常用的几种线性与非线性算法,提供了比较详细的推导过程(不包括线代的定理),和所有的C#代码实现。(下载二进制源代码
不过这篇文章里只有单变量二维空间上的拟合。
使用这篇文章及代码可以了解如何使用Math.NET进行矩阵操作,帮助极大,因为其他的文章偏向于论文,往往推导出解法后连计算步骤都不给,使用这里提供的算法可以得到最后一步的结果。
我在代码中找到了一个小BUG,于是给作者写了信,作者很热心的回复并且告诉我有个中国朋友进行了翻译,这是赵毅力同学的翻译。更推荐先阅读这个版本,因为所有的基本概念都做了介绍,不用自己去查教材或者维基百科了。

无名文章,这是我正在使用而且帮助排名第二的文章,看格式像论文或者会议上的技术报告,但是没找到标题,这篇文章提供了笛卡尔空间上的线,圆柱,圆锥,球等的拟合算法,由于没找到引用信息,无法判断这篇文章的正确或者权威性,我目前看到空间直线部分,和我们公司的软件的计算结果取得一致,未来两天会继续验证。(1月23日添加,已验证直线平面和圆柱,算法正确)
缺点是这篇文章里只有基本数据的计算方法,和算法思路,稍微具体点的推导都没有。例如——矩阵A是每个点减平均算出来的,然后使用SVD对A进行计算就可以得到空间向量的解。
如果没有线代基础或者相关的算法概念会觉得莫名其妙,结合第一篇文章看就好很多了。

更原理性的一篇,这篇文章有两个版本,这篇稍老,新的没仔细看,和这个几乎一样Faithful版本,要赞一下这个Prof.论文都放到了个人网站上,省得去各个黑心网站上付费,我觉得论文这种东西写出来就是为了让大家看的,卖几十刀实在是太黑了啊。
不过对应用层面帮助不大,不过如果想对算法实现改进(例如从最小二乘至最小元素法),应该会有帮助的,等我有需求时再看吧。

另外还有几篇是针对圆柱的,因为我个人工作的需求主要针对圆柱的拟合,所以也列在这里了。

5点计算圆柱的算法,给出了详细的推导和分析,产生多种结果的原因,以及Mathematica下的代码实现。

圆柱拟合的代数算法实现

最小误差(条件)及最小二乘拟合圆柱的实现应该是一个图形库的文档,应该是基于C++和OpenGL的库,也提供了代码实现。而且库中直接实现了基本元素的最小二乘拟合实现,圆柱C++实现

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注