Anzahl der Werte, die größer als ein Schwellenwert sind

8

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]' :

  • Anzahl der Elemente & gt; 5: 6
  • Indizes: [3 4 5 7 8 9]
MKS 05.10.2012, 00:23
quelle

3 Antworten

14

Sie verwenden find :

%Vor%     
Jonas 05.10.2012, 00:29
quelle
4

Sie verwenden sum , wodurch Sie die Anzahl der Elemente mit einem Befehl erhalten:

%Vor%

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 ):

%Vor%

Der Vollständigkeit halber: Die Indizierung mit logischen Elementen ist die gleiche wie bei regulären Indizes:

%Vor%     
Rody Oldenhuis 05.10.2012 05:44
quelle
2

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!

%Vor%

Bei größeren Werten von threashold ist die ganzzahlige Indizierung schneller. Ergebnisse für threashold=0.5 :

%Vor%

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:

  • Matlab konvertiert doppelte Indizes explizit vor dem Indexierungsaufruf in uint32-Indizes (ähnlich wie beim Integer-Test)
  • matlab übergibt doubles und führt die Double- & gt; int-Umwandlung während des Indizierungsaufrufs
  • aus

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?

    
angainor 05.10.2012 10:41
quelle

Tags und Links