資源簡介
提供測試用例,輸入三維離散點空間坐標,可以直接獲得最小二乘法的空間擬合直線,并可以求出每個離散點到空間直線的距離,方便剔除偏離較大的離散點

代碼片段和文件信息
%?空間直線擬合,并求每個點到直線距離
%?讀入已經存儲在txt文件中每個點x?y?z?坐標,也可以直接讀入二維數組,維數[點數*3]
clc;clear;close?all;
lineData=importdata(‘3D.txt‘);
figure(‘Color‘[1?1?1]);
scatter3(lineData(:1)?lineData(:2)?lineData(:3));
xlabel?‘x‘;
ylabel?‘y‘;
zlabel?‘z‘;
%zlim([2.91e4?2.97e4]);
hold?on;
%?擬合的直線必過所有坐標的算數平均值
xyz0=mean(lineData1);
%?協方差矩陣奇異變換,與擬合平面不同的是
%?所得直線的方向實際上與最大奇異值對應的奇異向量相同
centeredLine=bsxfun(@minuslineDataxyz0);????%bsxfun函數是對矩陣中每個元素進行?減?操作
[USV]=svd(centeredLine);???????%以降序順序返回矩陣的奇異值
direction=V(:1);
%?畫圖
t=-500:0.1:500;
xx=xyz0(1)+direction(1)*t;
yy=xyz0(2)+direction(2)*t;
zz=xyz0(3)+direction(3)*t;
plot3(xxyyzz)
%求三維空間一點到空間直線的距離,P為一點,Q1、Q2線上兩點
[mn]=size(xx);???
Q1(11)=xx(11);?Q1(12)=yy(11);?Q1(13)=zz(11);
Q2(11)=xx(1n);?Q2(12)=yy(1n);?Q2(13)=zz(1n);
P=zeros(13);??[m1n1]=size(lineData);??d=zeros(1m1);
for?i=1:m1
????P=lineData(i:);
????d(1i)?=?norm(cross(Q2-Q1P-Q1))/norm(Q2-Q1);
end
figure(‘Color‘[1?1?1]);
x=1:m1;
plot(xd‘r.‘);
xlabel?‘行號‘;
ylabel?‘距離‘;?
%取出所有行號
j=0;
for?i=1:m1
????if(d(1i)>10)
????????j=j+1;
????????hanghao(1j)=i;
????end
end
%去除偏差較大的點,重新存儲txt文件
[m2n2]=size(hanghao);??count=0;
for?k=1:n2
????q=hanghao(1k);
????for?k1=q:m1-1
????????lineData(q:)=lineData(q+1:);
????end
????m1=m1-1;
????count=count+1;
end
for?k2=1:m1-count
????lineData1(k2:)=lineData(k2:);
end
%?save?3D-1.txt??lineData1;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1617??2019-01-21?16:48??nihe.m
?????文件??????70928??2019-01-17?10:19??3D.txt
-----------?---------??----------?-----??----
????????????????72545????????????????????2
- 上一篇:讀取BMP信息并顯示的MATLAB程序
- 下一篇:matlab實現模糊c均值聚類
評論
共有 條評論