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