2017-06-13 6 views
3

Ich habe einen Vektor M mit einzelnen Elementen und Wiederholungen. Ich möchte alle einzelnen Elemente löschen. Etwas wie [1 1 2 3 4 5 4 4 5] zu [1 1 4 5 4 4 5] drehen.Entfernen Sie einzelne Elemente aus einem Vektor

Ich dachte, ich würde versuchen, die Anzahl der einzelnen Elemente erhalten dann verwenden Sie den Index zu löschen, was ich nicht brauchen, so etwas wie dieses:

uniq = unique(M); 
list = [uniq histc(M,uniq)]; 

Obwohl ich hier stecken und nicht sicher, wie man vorwärts geht. Kann jemand helfen?

Antwort

1

Sie können das Ergebnis mit dem folgenden Code erhalten:

A = [a.', ones(length(a),1)]; 
[C,~,ic] = unique(A(:,1)); 
result = [C, accumarray(ic,A(:,2))]; 
a = A(~ismember(A(:,1),result(result(:,2) == 1))).'; 

Die Idee ist, fügen Sie diejenigen die zweite Spalte von a', dann accumarray Basis auf der ersten Säule (Elemente a). Danach finden Sie die Elemente in der ersten Spalte, die in der zweiten Spalte eine Summensumme haben. Daher werden diese Elemente einmal in a wiederholt. Schließlich entfernen sie sie aus der ersten Spalte A.

0
X = [1 1 2 3 4 5 4 4 5]; 
Y = X; 
A = unique(X); 
for i = 1:length(A) 
    idx = find(X==A(i)); 
    if length(idx) == 1 
     Y(idx) = NaN; 
    end 
end 
Y(isnan(Y)) = []; 

Dann würde Y[1 1 4 5 4 4 5] sein. Es erkennt alle einzelnen Elemente und erstellt sie als NaN und entfernt dann alle NaN Elemente aus dem Vektor.

2

Hier ist eine Lösung mit unique, histcounts und ismember:

tmp=unique(M) ;   %finding unique elements of M 
%Now keeping only those elements in tmp which appear only once in M 
tmp = tmp(histcounts(M,[tmp tmp(end)])==1); %Thanks to rahnema for his insight on this 
[~,ind] = ismember(tmp,M); %finding the indexes of these elements in M 
M(ind)=[]; 

histcounts wurde in R2014b eingeführt. Bei älteren Versionen kann hist durch Ersetzen Sie diese Zeile mit diesem verwendet werden:

tmp=tmp(hist(M,tmp)==1); 
1

Hier ist eine billigere Alternative:

[s ii] = sort(a); 
x = [false s(2:end)==s(1:end-1)] 
y = [x(2:end)|x(1:end-1) x(end)] 
z(ii) = y; 
result = a(z); 

den Eingang Unter der Annahme

a = 

1 1 8 8 3 1 4 5 4 6 4 5 

wir die Liste sortieren s und Index der sortierten Liste erhalten ii

s= 

1 1 1 3 4 4 4 5 5 6 8 8 

können wir Index der wiederholten Elemente finden und es wir prüfen, ob ein Element zu dem vorhergehenden Element gleich ist

x =

0 1 1 0 0 1 1 0 1 0 0 1 

jedoch in x die ersten Elemente jedes Blocks weggelassen finden wir es [or] zwischen jedem Element mit dem vorherigen Element

y = 

1 1 1 0 1 1 1 1 1 0 1 1 

anwenden können, haben wir nun logischen Index der Wiederholungs sortiert ed Elemente. Es sollte in seiner ursprünglichen Reihenfolge neu geordnet werden.Für sie verwenden wir Index der sortierten Elemente ii:

z = 

1 1 1 1 0 1 1 1 1 0 1 1 

schließlich z nur die wiederholten Elemente zu extrahieren.

result = 

1 1 8 8 1 4 5 4 4 5 

Hier ist ein Ergebnis eines Tests in Octave * für die folgende Eingabe:

a = randi([1 100000],1,10000000); 

-------HIST-------- 
Elapsed time is 5.38654 seconds. 
----ACCUMARRAY------ 
Elapsed time is 2.62602 seconds. 
-------SORT-------- 
Elapsed time is 1.83391 seconds. 
-------LOOP-------- 
Doesn't complete in 15 seconds. 

* Da in Octave histcounts ich hist verwendet, so anstelle von histcounts nicht implementiert wurde.

Sie können es Online

testen
Verwandte Themen