空间三维散点数据的线性拟合
生活随笔
收集整理的這篇文章主要介紹了
空间三维散点数据的线性拟合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<span style="font-size:14px;">clc;
clear all;
close all;
num = 50; % num個隨機點
Rand1 = randi([-1,1],num,3); %噪聲范圍
Rand2 = randi([-1,1],num,3);
Point1 = [1:0.5:0.5*(num+1); 1:0.5:0.5*(num+1); 1:0.5:0.5*(num+1)]'+ Rand1;
plot3(Point1(:,1),Point1(:,2),Point1(:,3),'r.');
Point2 = [0.5*(num+1):-0.5:1; 1:0.5:0.5*(num+1); 0.5*(num+1):-0.5:1]'+ Rand2;
hold on;
plot3(Point2(:,1),Point2(:,2),Point2(:,3),'g+');%直線擬合1
t1=linspace(0,25);%有效范圍
F1 = @(p)arrayfun(@(n)norm(cross(Point1(num,:)-[p(1),p(2),p(3)],...[p(4),p(5),p(6)]))/norm([p(4),p(5),p(6)]),[1:size(Point1,1)]);
p= lsqnonlin(F1,[1 1 1 1 1 1]);
plot3(p(1)+t1*p(4),p(2)+t1*p(5),p(3)+t1*p(6));%直線擬合2
t2=linspace(0,-8);
F2 = @(p)arrayfun(@(n)norm(cross(Point2(num,:)-[p(1),p(2),p(3)],...[p(4),p(5),p(6)]))/norm([p(4),p(5),p(6)]),[1:size(Point2,1)]);
p= lsqnonlin(F2,[25,2,25,1,1,1]); %初始化迭代
plot3(p(1)+t2*p(4),p(2)+t2*p(5),p(3)+t2*p(6));
grid on;
hold off;</span>
fit_line.m
<span style="font-size:14px;">function [a,resnorm] = fit_line(a0,data) % 對三維數據進行直線擬合,將直線擬合成如下形式: % x-a(1) y-a(2) z-a(3) % ------ = ------ = ------ % a(4) a(5) a(6) % 原理:下面的 d 是各數據點到擬合直線的距離,利用 lsqnonlin 對 d 進行最小二乘 % a0 是初始值,data 是三維數據,第一行是 x,第二行是 y,第三行是 z [a,resnorm] = lsqnonlin(@fit_line_fun,a0); function d=fit_line_fun(a) % 傳給主函數的子函數 xdata=data(1,:); ydata=data(2,:); zdata=data(3,:);point=a(1:3); v=a(4:6); d(1:length(xdata))=0; for n=1:length(xdata) m=[xdata(n);ydata(n);zdata(n)]-point(:);d(n)=norm(cross(m,v(:)))/norm(v(:));% 利用解析幾何的知識求距離d end end end </span> 實驗效果圖:
總結
以上是生活随笔為你收集整理的空间三维散点数据的线性拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《XIM 企业即时通讯软件》
- 下一篇: 爱护身体之简易程序员健身操