Ich habe ziemlich viel Array. Um die Dinge einfacher zu machen, vereinfachen wir es:
%Vor%Also gibt es eine Gruppe von 1 (4 Elemente), 2 (2 Elemente), 3 (4 Elemente), 4 (2 Elemente) und 5 (8 Elemente). Jetzt möchte ich nur Spalten behalten, die zu einer Gruppe von 3 oder mehr Elementen gehören. So wird es sein wie:
%Vor%Ich habe es mit der for -Schleife gemacht, indem ich 1, 2, 3 usw. gescannt habe, aber es ist extrem langsam mit großen Arrays ... Vielen Dank für Anregungen, wie es effizienter geht :) Art.
Hier ist mein Zweiliner
%Vor%accumarray wird verwendet, um die einzelnen Mitglieder von A zu zählen. Finden Sie Auszüge, die das Kriterium "3 oder mehr Elemente" erfüllen. Schließlich sagt Ismember Ihnen, wo sie in A sind. Beachten Sie, dass A nicht sortiert werden muss. Accumarray funktioniert natürlich nur für Integer-Werte in A.
Wenn Ihr Vektor nicht unbedingt sortiert ist, müssen Sie ausführen, um die Anzahl der Vorkommen jedes Elements im Vektor zu zählen. Sie haben histc
nur dafür:
Die letzte Zeile wählt die Elemente aus, die weniger als 3 Vorkommen haben und löscht sie.
Wenn Ihr Vektor "semi-sorted" ist, dh wenn ähnliche Elemente im Vektor gruppiert sind (wie in Ihrem Beispiel), können Sie die Dinge ein wenig beschleunigen, indem Sie Folgendes tun:
%Vor%Beachten Sie, dass der Vektor nicht vollständig sortiert sein muss, sondern dass ähnliche Elemente nebeneinander liegen.
Was Sie beschreiben, heißt Lauflängencodierung .
Dafür gibt es in Matlab Software auf dem FileExchange. Oder Sie können es direkt wie folgt tun:
%Vor%Sobald Sie Ihre Lauflängencodierung haben, können Sie Elemente basierend auf der Länge entfernen. d. h.
%Vor%Und dann entschlüsseln, um das gewünschte Array zu erhalten:
%Vor%