2016-12-10 4 views
0

Ich schreibe einen Code, wo ich eine vector array Elemente überprüfen und überprüfen möchte, ob das vorliegende Element die vorherige x(m)=x(m+1) gleich ist, dann lösche es, wenn nicht im Array behalten. . Wie geht das?Wählen oder eliminieren Sie Indizes aus Vektor-Array in MATLAB

Hier, was ich zu tun versucht:

vg=vg1(441777:448207); 

j=zeros(size(vg)); 

for m=1:6431; 
    if m+1<6432 
     if vg(m)==vg(m+1) 
      j(m)=[]; 
     else 
      j(m)=vg(m); 
     end 
    end 
end 

Aber es funktioniert nicht und es gibt Fehler ,, So kann ich wissen, wie es zu tun?

Antwort

0

Das Problem liegt wahrscheinlich daran, dass Sie aktiv Elemente aus j innerhalb Ihrer Schleife entfernen und dann versuchen, später auf diese Elemente zuzugreifen. Sie sollten stattdessen nur j voller NaN Werte haben und dann die NaN Werte am Ende entfernen.

j = nan(size(vg)); 

% Go ahead and keep the first value 
j(1) = vg(1); 

% Just start at 2 and look backwards rather than using an if statement 
% every time through the loop 
for m = 2:numel(vg) 
    % Only change the value in j to a number if it's new 
    if vg(m - 1) ~= vg(m) 
     j(m) = vg(m); 
    end 
end 

% Remove all of the NaN values (the duplicates) 
j = j(~isnan(j)); 

Ein besserer vektorisierten Ansatz wäre diff zu verwenden, um die Unterschiede zwischen aufeinanderfolgenden Elementen zu berechnen und zu identifizieren, wo es verschiedene Zahlen (diff Ergebnis ist ~= 0) und nur die Elemente zu halten, indem die Ausgabe von diff(values) ~= 0 als logischen Verwendung Index in values.

values = [1 1 2 3 4 4 4 5 5 1 2 2]; 
result = values([true, diff(values) ~= 0]); 
%  1  2  3  4  5  1  2 

beachten, dass wir true zu Beginn der Ausgabe von diff(values) ~= 0 vorangestellt wird, da wir wollen immer auch das erste Element.

0

Der obige Code funktioniert nicht, da sich die Länge des Vektors j innerhalb der Schleife ändert. Also, auf einem Schritt m größer als die Länge (j), die Fehler steigt.

Auch die for-Schleife in Matlab ist sehr langsam, daher sind Matrixformberechnungen vorzuziehen (und klar).

vg = [1 1 2 3 4 4 4 5 5 1 2 2]; 
df = [1 diff(vg)]; 
vg(df == 0) = []; 
Verwandte Themen