Hauptinhalt

Auffinden von Array-Elementen, die Bedingungen erfüllen

Dieses Beispiel zeigt, wie Sie die Elemente eines Arrays filtern können, indem Sie Bedingungen auf das Array anwenden. Sie können zum Beispiel die geraden Elemente in einer Matrix untersuchen, die Position aller Nullen in einem mehrdimensionalen Array finden oder die NaN-Werte in Daten ersetzen. Sie können diese Aufgaben mit einer Kombination aus relationalen und logischen Operatoren durchführen. Die relationalen Operatoren (>, <, >=, <=, ==, ~=) legen Bedingungen für das Array fest, und Sie können mehrere Bedingungen anwenden, indem Sie sie mit den logischen Operatoren and, or oder not verbinden, die durch die Symbole &, | und ~ angegeben werden.

Anwenden einer einzelnen Bedingung

Um eine einzelne Bedingung anzuwenden, erstellen Sie zunächst eine 5×5-Matrix, die zufällige ganze Zahlen zwischen 1 und 15 enthält. Setzen Sie den Zufallszahlengenerator der Reproduzierbarkeit halber auf den Standardzustand zurück.

rng("default")
A = randi(15,5)
A = 5×5

    13     2     3     3    10
    14     5    15     7     1
     2     9    15    14    13
    14    15     8    12    15
    10    15    13    15    11

Verwenden Sie den relationalen Operator kleiner als, <, um zu bestimmen, welche Elemente von A kleiner als 9 sind. Speichern Sie das Ergebnis in B.

B = A < 9
B = 5×5 logical array

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

Das Ergebnis ist eine logische Matrix. Jeder Wert in B ist eine logische 1 (true) oder eine logische 0 (false), was angibt, ob das entsprechende Element von A die Bedingung A < 9 erfüllt. Ist A(1,1) zum Beispiel 13, dann ist B(1,1) eine logische 0 (false). Ist A(1,2) jedoch 2, dann ist B(1,2) eine logische 1 (true).

B enthält zwar Informationen darüber, welche Elemente in A kleiner als 9 sind, B gibt jedoch nicht Auskunft über die Werte dieser Elemente. Anstatt die beiden Matrizen Element für Element zu vergleichen, können Sie mit B in A indizieren.

A(B)
ans = 8×1

     2
     2
     5
     3
     8
     3
     7
     1

Das Ergebnis ist ein Spaltenvektor mit jenen Elementen von A, die kleiner als 9 sind. Da B eine logische Matrix ist, wird diese Operation als logische Indizierung bezeichnet. In diesem Fall ist das als Index verwendete logische Array genauso groß wie das Array, das es indiziert, aber dies ist keine Voraussetzung. Weitere Informationen finden Sie unter Array-Indizierung.

Einige Probleme erfordern Informationen über die Position der Array-Elemente, die eine Bedingung erfüllen, und nicht über ihre tatsächlichen Werte. In diesem Beispiel können Sie mit der find-Funktion alle Elemente in A finden, die kleiner als 9 sind.

I = find(A < 9)
I = 8×1

     3
     6
     7
    11
    14
    16
    17
    22

Das Ergebnis ist ein Spaltenvektor mit linearen Indizes. Jeder Index beschreibt die Position eines Elements in A, das kleiner als 9 ist, so dass in der Praxis A(I) das gleiche Ergebnis zurückgibt wie A(B). Der Unterschied besteht darin, dass A(B) eine logische Indizierung, A(I) hingegen eine lineare Indizierung verwendet.

Anwenden mehrerer Bedingungen

Sie können die logischen Operatoren and, or und not verwenden, um eine beliebige Anzahl von Bedingungen auf ein Array anzuwenden; die Anzahl der Bedingungen ist nicht auf eine oder zwei beschränkt.

Verwenden Sie zunächst den logischen Operator and, angegeben mit &, um zwei Bedingungen festzulegen: Die Elemente müssen kleiner als 9 und größer als 2 sein. Geben Sie die Bedingungen als logischen Index an, um die Elemente anzuzeigen, die beide Bedingungen erfüllen.

A(A<9 & A>2)
ans = 5×1

     5
     3
     8
     3
     7

Das Ergebnis ist eine Liste aller Elemente in A, die beide Bedingungen erfüllen. Achten Sie darauf, dass Sie jede Bedingung mit einer separaten Anweisung festlegen, die durch einen logischen Operator verbunden ist. Zum Beispiel können Sie die obigen Bedingungen nicht durch A(2<A<9) festlegen, da dies als A(2<A | A<9) evaluiert wird.

Finden Sie als nächstes die Elemente in A auf, die kleiner als 9 und gerade sind.

A(A<9 & ~mod(A,2))
ans = 3×1

     2
     2
     8

Das Ergebnis ist eine Liste mit allen geraden Elementen in A, die kleiner als 9 sind. Die Verwendung des logischen Operators not (~) wandelt die Matrix mod(A,2) in eine logische Matrix um, die an jenen Stellen den Wert einer logischen 1 (true) hat, an denen ein Element durch 2 teilbar oder gerade ist.

Finden Sie schließlich die Elemente in A, die kleiner als 9 und gerade und ungleich 2 sind.

A(A<9 & ~mod(A,2) & A~=2)
ans = 
8

Das Ergebnis, 8, ist kleiner als 9, gerade, und nicht gleich 2. Es ist das einzige Element in A, das alle drei Bedingungen erfüllt.

Verwenden Sie die find-Funktion, um den Index des Elements mit der Nummer 8 zu ermitteln, das die Bedingungen erfüllt.

find(A<9 & ~mod(A,2) & A~=2)
ans = 
14

Das Ergebnis ist A(14) = 8.

Ersetzen von Werten, die die Bedingung erfüllen

Manchmal ist es sinnvoll, die Werte mehrerer vorhandener Array-Elemente gleichzeitig zu ändern. Verwenden Sie die logische Indizierung mit einer einfachen Zuweisungsanweisung, um die Werte in einem Array zu ersetzen, die eine Bedingung erfüllen.

Ersetzen Sie zum Beispiel alle Werte in A, die größer als 10 sind, durch die Zahl 10.

A(A>10) = 10
A = 5×5

    10     2     3     3    10
    10     5    10     7     1
     2     9    10    10    10
    10    10     8    10    10
    10    10    10    10    10

Ersetzen Sie als nächstes alle Werte in A, die nicht gleich 10 sind, durch einen NaN-Wert.

A(A~=10) = NaN
A = 5×5

    10   NaN   NaN   NaN    10
    10   NaN    10   NaN   NaN
   NaN   NaN    10    10    10
    10    10   NaN    10    10
    10    10    10    10    10

Ersetzen Sie zum Schluss alle NaN-Werte in A durch Nullen und wenden Sie den logischen Operator not auf A an, ~A.

A(isnan(A)) = 0;
C = ~A
C = 5×5 logical array

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

Die resultierende Matrix hat eine logische 1 (true) anstelle der NaN-Werte, und eine logische 0 (false) anstelle der 10er. Die logische not-Operation, ~A, wandelt das numerische Array A in ein logisches Array C um, so dass A&C eine Matrix aus logischen 0 (false)-Werten und A|C eine Matrix aus logischen 1 (true)-Werten zurückgibt.

Siehe auch

| | | | | | | |