Ich habe eine Matrix A
. Jetzt möchte ich die Anzahl der Elemente größer als 5 und ihre entsprechenden Indizes finden. Wie löst man das in Matlab ohne Verwendung von for-Schleife?
Zum Beispiel wenn A = [1 4 6 8 9 5 6 8 9]'
:
[3 4 5 7 8 9]
Sie verwenden sum
, wodurch Sie die Anzahl der Elemente mit einem Befehl erhalten:
Brauchen Sie wirklich explizite Indizes? Weil die logische Matrix A>5
auch als Index verwendet werden kann (normalerweise etwas effizienter als die Indizierung mit find
):
Der Vollständigkeit halber: Die Indizierung mit logischen Elementen ist die gleiche wie bei regulären Indizes:
%Vor%Motiviert durch die obige Diskussion mit Rody, hier ein einfacher Benchmark, der die Geschwindigkeit der Integer-Indexierung gegenüber der logischen Array-Indizierung in MATLAB testet. Eine wichtige Sache, würde ich sagen, da "vektorisiert" MATLAB hauptsächlich über Indexierung ist. Also
%Vor%Auf meinem Computer sind die Ergebnisse
%Vor% bedeutet, dass die beiden Methoden fast gleich sind - so habe ich das Beispiel threashold
gewählt. Es ist interessant, weil das Array index_integer
fast 4 mal größer ist!
Bei größeren Werten von threashold
ist die ganzzahlige Indizierung schneller. Ergebnisse für threashold=0.5
:
Wenn ich hier nicht etwas falsch mache, scheint die ganzzahlige Indexierung die meiste Zeit am schnellsten zu sein.
Einschließlich der Erstellung der Indizes im Test ergeben sich jedoch sehr unterschiedliche Ergebnisse:
%Vor%Ergebnisse (Rody):
%Vor%Ergebnisse (angainor):
%Vor%So scheint es, dass die Indizierung schneller ist, wenn mit Ganzzahlen indiziert wird, aber die logische Indizierung von vorne nach hinten funktioniert viel besser.
Der Laufzeitunterschied zwischen den letzten beiden Methoden ist jedoch unerwartet - es scheint, dass die Matlab-Interna die Doppelgänger entweder nicht in Ganzzahlen umwandeln, vor der eigentlichen Indizierung eine Fehlerüberprüfung auf jedem Element durchführen. Ansonsten hätten wir praktisch keinen Unterschied zwischen den Double- und Integer-Methoden gesehen.
Bearbeiten Es gibt zwei Möglichkeiten, wie ich es sehe:
Die zweite Option sollte schneller sein, weil wir die doppelten Indizes nur einmal lesen müssen. In unserem expliziten Konvertierungstest müssen wir doppelte Indizes lesen, ganzzahlige Indizes schreiben und dann die ganzzahligen Indizes während der eigentlichen Indizierung erneut lesen. Also Matlab sollte schneller sein ... Warum ist es nicht?