2017-02-28 94 views
0

我有一个20点的数据集,我需要将其包含在一个椭圆中。我正在尝试计算椭圆中心与去除最远点之间的最大距离,重建一个新的椭圆并重复该过程。循环优化

下面是代码:

P = [1.397100 0.934550 
-0.708828 -3.993403 
-0.775017 -0.167091 
1.861729 -0.334958 
-0.376357 -3.187580 
0.294908 -0.765351 
0.952188 -1.872313 
0.524652 2.972442 
0.889532 -0.331162 
0.991093 0.278271 
0.262071 0.078590 
0.901017 0.320209 
-0.797258 0.518452 
-0.656796 0.268351 
0.333667 0.601893 
0.762157 0.613208 
0.292147 -1.555187 
0.122875 -0.860661 
0.702863 -3.195442 
-1.140430 -1.919686]' 
t = 0.001; 
K = convhulln(P'); 
K = unique(K(:)); 
Q = P(:,K); 

[A , C] = MinVolEllipse(Q, t) 
figure 
plot(P(1,:),P(2,:),'*') 
hold on 
Ellipse_plot(A,C) 

%Rule=size(P',1) 

W=P' 
v=C' 
Cx=v(1) 
Cy=v(2) 
dist=sqrt((W(:,1)-Cx).^2+(W(:,2)-Cy).^2) 
Remove=find(dist==max(dist(:))) 
W(Remove,:)=[] 
W=W' 
Rule=size(W',1) 
while Rule>5 
    W=W'; 
    v=C'; 
    Cx=v(1); 
    Cy=v(2); 
    dist=sqrt((W(:,1)-Cx).^2+(W(:,2)-Cy).^2); 
    Remove=find(dist==max(dist(:))); 
    W(Remove,:)=[]; 
    W=W'; 
end 
[A , C] = MinVolEllipse(W, t) 
figure 
plot(W(1,:),W(2,:),'*') 
hold on 
Ellipse_plot(A,C) 

我知道我做错了什么事,但现在我坚持用“忙”约10分钟。如何正确循环过程?

谢谢!

+1

你为什么老是一遍又一遍地调换的事情?例如。 'W = W';'? –

回答

2

您需要更新的Rule

while Rule>5 
    W=W'; 
    v=C'; 
    Cx=v(1); 
    Cy=v(2); 
    dist=sqrt((W(:,1)-Cx).^2+(W(:,2)-Cy).^2); 
    Remove=find(dist==max(dist(:))); 
    W(Remove,:)=[]; 
    W=W'; 
    Rule=size(W',1) 
end 

值作为一个单独的点,例如你执行一些冗余操作你循环的第一行和最后一行做相反的操作。也许是这样的:(注意代码不进行测试)

while size(W,1)>5 
    dist=sqrt((W(:,1)-C(1)).^2+(W(:,2)-C(2)).^2); 
    % the second returned variable is the location 
    [~, Remove] = max(dist(:)); 
    W(Remove,:)=[]; 
end 
+0

谢谢。但现在它将点数减少到1,并且不会停止在5点。点数达到5时如何停止? –

+0

解决了它,在创建省略号之前忘记调换W了。谢谢! –

+0

仔细检查你是否使用了正确的尺寸,你正在做一些很多转换,很难跟上。我缺少一些函数'MinVolEllipse',所以我无法计算'C'的值,你能否提供示例值。你的'P'是'W',所以我们有这个。 – mpaskov