前言
由于项目需求,需要根据空间圆柱的一段曲面,估计出圆柱中轴所在直线。近期查阅并整理了部分资料,望大家一起学习交流。
一、最小二乘法拟合直线原理
原理部分主要参考链接: 空间直线的最小二乘拟合,这里重新整理了一下。
空间直线的简化形式为:
即:矩阵形式为:直线上第i个点满足:
则有:左右乘以
则有:最后可得:
二、Matlab代码
代码部分主要参考链接: 空间直线最小二乘拟合。
data = load('data.txt');%12行3列数据,x,y,zxData=data(:,1)';%读取n行,一列数据,并转置yData=data(:,2)';zData=data(:,3)';L=length(xData);%获取数组长度ZM=[zData;ones(1,L)];%对应为12列数据MM=ZM*ZM';XM=xData*ZM';%1*2YM=yData*ZM';%1*2A=(XM/MM);%1行*2列,用XM/MM比XM*inv(MM)速度快B=(YM/MM)';z1=400:430;%设置直线z的范围x1=A(1)*z1+A(2);%空间直线子方程1:x=a*z+by1=B(1)*z1+B(2);%空间直线子方程2:y=c*z+dplot3(x1,y1,z1,'r',xData,yData,zData,'o');axis([20 60,3,5,400,500])
三、可视化结果
空间直线方程x=az+b;y=cz+d中的a,b,c,d,即为最后求得的A(1),A(2),B(1),B(2)。