%% 读取L1,L2中点的坐标进行平面拟合,求出平面方程参数
%12-18
clc;
clear all;
%% 读取点坐标
% L1 = load('Line1.mat');
% L2 = load('Line2.mat');
%
% Data = [L1.L1 L2.L2];%两直线上的点
load('Data.mat');%平面上随机取点
Data = data;
X = Data(1,:)';
Y = Data(2,:)';
Z = Data(3,:)';
%增加干扰噪音
Z = Z + randn(size(X));
%function [a,b,c] = fitting(X,Y,Z)
%% 回归分析
% F = [X,Y,ones(size(X))];
% A = F\Z;%方程系数
%
% fprintf('a = %f, b = %f ,c = %f \n',A(1),A(2),A(3));
% fprintf('z = %f*x + %f*y + %f \n',A(1),A(2),A(3));
%
% % 求回归误差
% e = (A(1)*X + A(2)*Y +A(3)) -Z;
%stem(1:202,e,'-');
%% 定义误差最大值,当点误差超过该范围则抛弃该点,再进行回归,直到误差值都属于允许范围内。
E = 1;
flag = true;
e = zeros(length(Data),1);
while(flag)
len = length(e);
pointNumber = length(e);%回归分析使用的点数量
useful = ones(pointNumber,1);%标示每个点是否属于噪声
regress = false;
%回归分析
F = [X,Y,ones(size(X))];
A = F\Z;%方程系数
fprintf('a = %f, b = %f ,c = %f \n',A(1),A(2),A(3));
fprintf('z = %f*x + %f*y + %f \n',A(1),A(2),A(3));
% 求回归误差
e = (A(1)*X + A(2)*Y +A(3)) -Z;
for i = 1:len
if(abs(e(i)) > E)
pointNumber = pointNumber -1;
useful(i) =0;
regress = true;%存在噪声点,需要剔除该点再进行回归
end
end
if(regress == false)
flag = false;
break;
else
flag = true;
end
%过滤数据
newX = zeros(pointNumber,1);
newY = zeros(pointNumber,1);
newZ = zeros(pointNumber,1);
count= 1;
for j = 1:len
if(useful(j) == 1)
newX(count) = X(j);
newY(count) = Y(j);
newZ(count) = Z(j);
count = count +1;
else
continue;
end
end
X = zeros(pointNumber,1);
Y = zeros(pointNumber,1);
Z = zeros(pointNumber,1);
X = newX;
Y = newY;
Z = newZ;
e = zeros(pointNumber,1);
end
评论4