Matlab最小二乘法椭圆拟合

function [semimajor_axis,semiminor_axis,x0,y0,phi]=ellipse_fit(x,y)
x=x(:);
y=y(:);
M=[2*x.*y y.^2 2*x 2*y ones(size(x))];
pinv(M)
e=M\(-x.^2);
a=1;
b=e(1);
c=e(2);
d=e(3);
f=e(4);
g=e(5);
delta=b^2-a*c;
x0=(c*d-b*f)/delta;
y0=(a*f-b*d)/delta;
phi=0.5*acot((c-a)/(2*b));
nom=2*(a*f^2+c*d^2+g*b^2-2*b*d*f-a*c*g);
s=sqrt(1+(4*b^2)/(a-c)^2);
a_prime=sqrt(nom/(delta*((c-a)*s-(c+a))));
b_prime=sqrt(nom/(delta*((a-c)*s-(c+a))));
semimajor_axis=max(a_prime,b_prime);
semiminor_axis=min(a_prime,b_prime);
if (a_prime<b_prime)
    phi=pi/2-phi;
end
end

你可能感兴趣的:(matlab,最小二乘法,线性代数)