移动最小二乘法(MLS)曲线曲面拟合C++代码实现

移动最小二乘法(MLS)曲线曲面拟合

曲线曲面拟合有很多种方法,Beizer,B样条等,曲面拟合移动最小二乘法是一个很好的选择,本文会详细讲解一下移动最小二乘法方法拟合曲面,并给出C++代码实现。
本文首先是最小二乘法的分析,然后是画曲面曲线图。

目录

[TOC]来生成目录:

文章目录

  • 移动最小二乘法(MLS)曲线曲面拟合
      • 目录
    • @[toc]
    • MLS的讲解
      • MLS代码块
      • 画曲线曲面

MLS的讲解

移动最小二乘法是在最小二乘法基础上加以改进的,添加了权函数等,具体的可以参考论文,“移动最小二乘法论文”链接,这篇论文对MLS讲解的很详细,最后还给出了程序设计思路。我做一点点说明,论文中的矩阵A的写法欠妥,其他关于移动最小二乘法研究中还有另外一种写法:这里写图片描述,这里的B对应论文中的P,这点要注意,这样的话A就是一个矩阵。如果是线性基的二维曲线,矩阵A就是:
移动最小二乘法(MLS)曲线曲面拟合C++代码实现_第1张图片,依次类推,其他的可以详看论文。

MLS代码块

代码的话我是根据论文中提供的程序设计,再结合一些网上的资料编写出来的,编程语言是C++;当然我也编写了python,应该是先编python,再编的C++。原因是python中可以加载一个矩阵运算库,C++中没有矩阵运算,要自己编写库,大家可以参考我这篇博客,介绍了矩阵运算链接。但是后来实验发现,python跑起来很费时间,C++只需它的一半的时间久跑完了,需要python代码也可以私信我,这里就不贴了。哦,对了,代码是包含很多自定义函数和变量,大家不要瞎贴代码,对照那篇论文的程序设计思路一下子就懂了,话不多说,上代码:

//移动最小二乘法的具体计算过程,参照论文“基于移动最小二乘法的曲线曲面拟合”,AB矩阵参照论文“移动最小二乘法的研究”
int MLS_Calc(int x_val,int y_val,float x[],float y[],float z[])
========================================2019-03-05============================
这里有些错误。三维曲面拟合是以二维(x,y)为基函数的,因此这里只是(x),错了。可以去搜代码去看,一维二维基函数都有。↓↓
{
	int max_delta=max_x-min_x;//区域半径
	float p[M][N]={0};
	float sumf[N][N]={0};
	float w[M]={0};
    for(int j=0;j255)
		z_val=255;
	if(z_val<0)
		z_val=0;

	A.free_Matrix();
	A_1.free_Matrix();
	B.free_Matrix();
	
	D1.free_Matrix();
	D_A1_mul.free_Matrix();
	D_A1_B_mul.free_Matrix();
	z1.free_Matrix();
	Z.free_Matrix();

	return (int)z_val;
}

画曲线曲面

跑一个程序能看得到结果心里是很开心的,非常有成就感。想看到拟合结果,曲线C++可以画出来,具体可以参考C++画曲线链接,曲面的话matlab是不错选择,但是软件太大了,python也是可以画曲面的,网上一搜一大堆,着了就不给链接了,网上很多,参考综合。

---------------------------------------------------------------2019-02-23---------------------------------------------------------
真的很感谢大家的支持,C++和python版本的源代码都不全,而且写的都有问题,我的资源里貌似有。我个人建议大家去github上搜索,都有很多种版本;matlab版本还可以去mathworks上搜。

---------------------------------------------------------------2019-03-05---------------------------------------------------------
最近一些小伙伴们提出了博客的一些错误地方,还是很谢谢你们的。我做一下说明。具体的大家可以去我之前说的网站下载代码去研究下,还是不太明白可以去找一些硕士论文看看,写的很详细。

-------------------------------------------------------------2019-05-22---------------------------------------------------------
我还写了另外一篇博客:深入理解移动最小二乘法曲面拟合代码 ,里面有代码简要的讲解改进,也放了相关代码链接,大家可以去那下载。

你可能感兴趣的:(C++)