2017-02-28 96 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