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

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

目录

[TOC]来生成目录:

文章目录

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

MLS的讲解

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

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;j<M;j++)//求w{float s=fabs((x[j]-x_val))/max_delta;if(s<=0.5)w[j]=2/3.0-4*s*s+4*s*s*s;else{if(s<=1)w[j]=4/3.0-4*s+4*s*s-4*s*s*s/3.0;elsew[j]=0;}p[j][0]=1;//每个采样点计算基函数p[j][1]=x[j];p[j][2]=y[j];p[j][3]=x[j]*x[j];p[j][4]=x[j]*y[j];p[j][5]=y[j]*y[j];}f(w,x,y,sumf,p);//计算得出A矩阵float p1[N];Matrix A=Trans_Matrix(sumf,N);Matrix A_1=m_c.Matrix_copy(&A);m_c.Matrix_inv(&A_1);//求A矩阵的逆A_1Matrix B(N,1);//求矩阵B,N行M列B.init_Matrix();for(int j=0;j<M;j++)//求得B矩阵的每列{p1[0]=1*w[j];p1[1]=x[j]*w[j];p1[2]=y[j]*w[j];p1[3]=x[j]*x[j]*w[j];p1[4]=x[j]*y[j]*w[j];p1[5]=y[j]*y[j]*w[j];Matrix P=Trans_Matrix_One(p1,N);//数组P1转成1行N列的P矩阵if(j==0)//第一列直接赋值{for(int i=0;i<N;i++)B.write(i,0,p1[i]);}else{m_c.Matrix_trans(&P);//矩阵转置,P转为N行1列矩阵m_c.Matrix_addCols(&B,&P);//矩阵B列附加,形成N行M列矩阵}P.free_Matrix();}float D[N]={1,x_val,y_val,x_val*x_val,x_val*y_val,y_val*y_val};Matrix D1=Trans_Matrix_One(D,N);//转成1行N列矩阵Matrix D_A1_mul(1,N);//定义矩阵并初始化相乘的结果矩阵,1行N列D_A1_mul.init_Matrix();if(m_c.Matrix_mul(&D1,&A_1,&D_A1_mul)==-1)cout<<"矩阵有误1!";//1行N列矩阵乘以N行N列矩阵得到结果为1行N列Matrix D_A1_B_mul(1,M);//定义矩阵并初始化相乘的结果矩阵,1行M列D_A1_B_mul.init_Matrix();if(m_c.Matrix_mul(&D_A1_mul,&B,&D_A1_B_mul)==-1)cout<<"矩阵有误2";//1行N列矩阵乘以N行M列矩阵得到记过矩阵为1行M列Matrix z1=Trans_Matrix_One(z,M);//将数组z转换成1行M列矩阵m_c.Matrix_trans(&z1);//转置得到M行1列矩阵Matrix Z(1,1);//得到矩阵结果,1行1列Z.init_Matrix();if(m_c.Matrix_mul(&D_A1_B_mul,&z1,&Z)==-1)cout<<"矩阵有误3!";//1行M列矩阵乘以M行1列矩阵得到1行1列矩阵,即值Zfloat z_val=Z.read(0,0);if(z_val>255)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---------------------------------------------------------
我还写了另外一篇博客:深入理解移动最小二乘法曲面拟合代码 ,里面有代码简要的讲解改进,也放了相关代码链接,大家可以去那下载。

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

  1. 基于移动最小二乘法的曲线曲面拟合(python语言实现)

    1.移动最小二乘法 上篇论文采用最小二乘法来拟合曲线,如果离散数据量比较大,形状复杂,还需要分段拟合和平滑化,因此采用移动最小二乘法进行曲线拟合,可以克服上面的缺点,还具有一些优点: 移动最小二乘法与 ...

  2. 基于移动最小二乘法的曲线曲面拟合论文阅读笔记

    基于移动最小二乘法的曲线曲面拟合论文阅读笔记 论文地址:http://www.cnki.com.cn/Article/CJFDTotal-GCTX200401016.htm 一.Problem Sta ...

  3. 移动最小二乘法MLS

    最近在家看点云去噪相关的论文,有算法是使用MLS进行曲面拟合点云曲面,然后将点投影到该曲面,借此机会学习了一下MLS,现做一下记录. MLS,即移动最小二乘法Moving Least Square,其 ...

  4. C语言控制台应用程序绘制曲线,C语言控制台绘制曲线的实现代码

    本文实例为大家分享了C语言控制台绘制曲线的具体代码,供大家参考,具体内容如下 首先我们应该要知道曲线的方程,这里以直角坐标为例 设我们曲线方程为 y = f(x) 然后我们把它化成 y - f(x) ...

  5. html数字数据走势图,利用HTML5实现数据曲线走势图表代码

    特效描述:利用HTML5实现 数据曲线 走势图表代码.利用HTML5实现数据曲线走势图表代码 代码结构 1. 引入JS 2. HTML代码 var data = generateDayWiseTime ...

  6. bezier曲线解析与代码(c++)

    前言: 作为rhino重度用户,我对于nurbs建模早有耳闻,但对于何为nurbs却不得其解.最近借上<计算机辅助设计>课程的机会,对此作了一些深入的学习,于是在此记录一下一些课程笔记和课 ...

  7. aitken插值方法的c++代码_无人驾驶路径规划技术-三次样条插值曲线及Python代码实现...

    自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的.碰撞避免的行驶路径和舒适的运动速度.生成行驶路径最经典方法之一就是是Sampling ...

  8. Hilbert曲线介绍以及代码实现

    空间填充曲线是指,一维曲线去包含整个二维甚至多维空间的一种函数曲线.而根据不同的排列规则,可以得到不同的空间填充曲线.     如Z-order曲线, 如图1(也就是geohash采取的曲线),Pea ...

  9. 一文完全理解模型ks指标含义并画出ks曲线(包含代码和详细解释)

    KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估, 指标衡量的是好坏样本累计分部之间的差值. 好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强. ks=ma ...

最新文章

  1. Could not load type 'System.Web.Mvc.ViewPagedynamic' in asp.net mvc2 after publishing the website
  2. python tkinter 循环显示文本_Python简易音乐播放器
  3. 用 ABAP 实现的报表欢迎屏幕 - Splash Screen
  4. 电脑mod_(电脑游戏) 层层恐惧2、冒险游戏——电脑配置要求单机游戏MOD攻略修改器下载...
  5. 活动子项父项的复杂CSS选择器[重复]
  6. 在线下单系统php源码,PIMS在线订单管理系统v4.2.9
  7. 最强的ubuntu8.04安装配置手册
  8. οnchange相当于前端js函数,可以实现前端实时更新以及修改验证
  9. QQ微信域名防封 预防域名封禁 强制跳转至浏览器打开
  10. php 计算壬子,壬子日是哪一天 壬子日怎么算
  11. 第115章 属性关键字 - SqlListDelimiter
  12. 超兔指纹浏览器(TO12345)是什么?
  13. 通信工程/电子信息工程 保研夏令营/预推免流程分析
  14. 电脑预装linux系统,电脑预装Linux第三方系统怎么破?看外行人重装Win10系统的精准攻略...
  15. 计算机图形学中的常用模型
  16. 汽车行业使用LDO直接连接电池的应用
  17. API工具栏教你如何采集淘宝拼多多商品详情数据
  18. java B2B2C源码电子商务平台 ---搭建Eureka注册中心
  19. #define 后只有一个参数
  20. Android Percent Layout 安卓百分比布局

热门文章

  1. Firebase国内替代方案
  2. 打造个人版微信小程序(1)——本地开发api接口调用
  3. 自动化测试学习daytwo(接口自动化概论)
  4. Houdini 节点
  5. AES加解密(ECB模式)
  6. 相关向量机(RVM)
  7. Python:警告 的11种情况
  8. html自动淡入淡出,纯css实现淡入淡出_html/css_WEB-ITnose
  9. 任正非:5G实际上被夸大了
  10. 深入理解模拟退火算法(Simulated Annealing)