Main Content

Indizierung

Indexzeichen

Das Element in Zeile i und Spalte j von A wird als A(i,j) angegeben. Beispielsweise ist A(4,2) die Zahl in der vierten Zeile und der zweiten Spalte. Für das magische Quadrat ist A(4,2) gleich 15. Um also die Summe der Elemente in der vierten Spalte von A zu berechnen, geben Sie Folgendes ein:

A(1,4) + A(2,4) + A(3,4) + A(4,4)

Dieses Indexzeichen ergibt

ans =
     34

Dies ist jedoch nicht die eleganteste Art und Weise, um eine einzelne Spalte zu summieren.

Es ist auch möglich, auf die Elemente einer Matrix mit einem einzelnen Indexzeichen, A(k), zu verweisen. Üblicherweise wird auf Zeilen- und Spaltenvektoren mit einem einzelnen Indexzeichen verwiesen. Allerdings kann dieses auch für eine vollständig zweidimensionale Matrix gelten. In diesem Fall wird das Array als ein langer Spaltenvektor betrachtet, der aus den Spalten der ursprünglichen Matrix gebildet wird. Für das magische Quadrat ist A(8) eine weitere Möglichkeit, auf den Wert 15 zu verweisen, der in A(4,2) gespeichert ist.

Wenn Sie versuchen, den Wert eines Elements außerhalb der Matrix zu verwenden, ergibt es einen Fehler:

t = A(4,5)
Index überschreitet Matrixdimensionen.

Umgekehrt gilt, wenn Sie einen Wert in einem Element außerhalb der Matrix speichern, wird die Größe erweitert, damit der neue Wert Platz hat:

X = A;
X(4,5) = 17

X =
    16     3     2    13     0
     5    10    11     8     0
     9     6     7    12     0
     4    15    14     1    17

Der Doppelpunkt-Operator

Der Doppelpunkt, :, ist einer der wichtigsten Operatoren in MATLAB®. Er tritt in vielen verschiedenen Formen auf. Der Ausdruck

1:10

ist ein Vektor, der die Ganzzahlen von 1 bis 10 enthält:

1     2     3     4     5     6     7     8     9    10

Für einheitenlose Abstände geben Sie ein Inkrement an. Beispiel:

100:-7:50

ist

100    93    86    79    72    65    58    51

und

0:pi/4:pi

ist

0    0.7854    1.5708    2.3562    3.1416

Ausdrücke mit Indexzeichen, die Doppelpunkte beinhalten, beziehen sich auf Teile einer Matrix:

A(1:k,j)

entspricht den ersten k Elementen der j. Spalte von A. Daher berechnet

sum(A(1:4,4))

die Summe der vierten Spalte. Es gibt jedoch bessere Möglichkeiten, um diese Berechnung auszuführen. Der Doppelpunkt selbst bezieht sich auf alle Elemente in einer Zeile oder Spalte einer Matrix und das Schlüsselwort end bezieht sich auf die letzte Zeile oder Spalte. Daher berechnet

sum(A(:,end))

die Summe der Elemente in der letzten Spalte von A:

ans =
     34

Warum ist die magische Summe für ein 4x4-Quadrat gleich 34? Wenn die Ganzzahlen von 1 bis 16 in vier Gruppen mit identischen Summen sortiert werden, muss diese Summe

sum(1:16)/4

sein und ist damit natürlich

ans =
     34

Verknüpfung

Unter Verknüpfung versteht man die Zusammenführung kleiner Matrizen, um größere Matrizen zu erstellen. Tatsächlich haben Sie Ihre erste Matrix durch Verknüpfung ihrer einzelnen Elemente erstellt. Die eckigen Klammern [] sind dabei der Verknüpfungsoperator. Beginnen Sie beispielsweise mit dem magischen 4x4-Quadrat, A, und bilden Sie

B = [A  A+32; A+48  A+16]

Das Ergebnis ist eine 8x8-Matrix durch die Zusammenführung der vier Untermatrizen:

B =

    16     3     2    13    48    35    34    45
     5    10    11     8    37    42    43    40
     9     6     7    12    41    38    39    44
     4    15    14     1    36    47    46    33
    64    51    50    61    32    19    18    29
    53    58    59    56    21    26    27    24
    57    54    55    60    25    22    23    28
    52    63    62    49    20    31    30    17

Mit dieser Matrix haben Sie bereits zur Hälfte ein weiteres magisches Quadrat erstellt. Seine Elemente sind eine Neuanordnung der Ganzzahlen 1:64. Seine Spaltensummen entsprechen dem korrekten Wert für ein magisches 8x8-Quadrat:

sum(B)

ans =
   260   260   260   260   260   260   260   260

Doch seine Zeilensummen, sum(B')', sind nicht immer gleich. Es ist eine weitere Manipulation erforderlich, damit ein gültiges magisches 8x8-Quadrat entsteht.

Löschen von Zeilen und Spalten

Zeilen und Spalten können aus einer Matrix mit lediglich einem Paar eckiger Klammern gelöscht werden. Beginnen Sie mit

X = A;

Anschließend verwenden Sie zum Löschen der zweiten Spalte von X

X(:,2) = []

Dadurch ändert sich X in

X =
    16     2    13
     5    11     8 
     9     7    12
     4    14     1

Wenn Sie ein einzelnes Element aus einer Matrix löschen, ist das Ergebnis keine Matrix mehr. Daher resultieren Ausdrücke wie

X(1,2) = []

in einem Fehler. Durch die Verwendung eines einzelnen Indexzeichens wird jedoch ein einzelnes Element oder eine Elementfolge gelöscht und die verbleibenden Elemente werden in einem Zeilenvektor neu angeordnet. Daher resultiert

X(2:2:10) = []

in

X =
    16     9     2     7    13    12     1

Skalarexpansion

Matrizen und Skalare können auf unterschiedliche Weise kombiniert werden. Beispielsweise wird ein Skalar von einer Matrix subtrahiert, indem er von jedem Element subtrahiert wird. Der Mittelwert der Elemente im vorliegenden magischen Quadrat ist 8,5. Daher bildet

B = A - 8.5

eine Matrix, deren Spaltensummen gleich null sind:

B =
      7.5     -5.5     -6.5      4.5
     -3.5      1.5      2.5     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

sum(B)

ans =
     0     0     0     0

Mit Skalarexpansion weist MATLAB einen angegebenen Skalar allen Indizes in einem Bereich zu. Beispiel:

B(1:2,2:3) = 0

setzt einen Teil von B auf null:

B =
      7.5        0        0      4.5
     -3.5        0        0     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

Logische Indizierung

Die logischen Vektoren, die mit logischen und relationalen Operationen erstellt werden, können zum Referenzieren von Subarrays verwendet werden. Angenommen, X ist eine gewöhnliche Matrix und L ist eine Matrix derselben Größe, bei der es sich um das Ergebnis einer logischen Operation handelt. Dann gibt X(L) die Elemente von X an, wobei die Elemente von L ungleich null sind.

Diese Art von Indizierung kann in einem Schritt erfolgen, indem die logische Operation als Indizierungsausdruck angegeben wird. Angenommen, es liegt folgender Datensatz vor:

x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];

Dabei ist NaN eine Markierung für eine fehlende Beobachtung, zum Beispiel eine fehlende Antwort für ein Element in einem Fragebogen. Zum Entfernen der fehlenden Daten mithilfe der logischen Indizierung verwenden Sie den Indizierungsausdruck isfinite(x), der für alle endlichen numerischen Werte wahr und für NaN sowie für Inf falsch ist:

x = x(isfinite(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

Jetzt gibt es eine Beobachtung, 5.1, die sich deutlich von den anderen zu unterscheiden scheint. Es handelt sich um einen Ausreißer. Mit der folgenden Anweisung werden Ausreißer entfernt. In diesem Fall sind es jene Elemente, die weiter als drei Standardabweichungen vom Mittelwert entfernt sind:

x = x(abs(x-mean(x)) <= 3*std(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

Für ein weiteres Beispiel heben Sie die Position der Primzahlen im magischen Quadrat von Dürer mithilfe logischer Indizierung und Skalarexpansion hervor, um die Nicht-Primzahlen auf 0 zu setzen. (Siehe Die Funktion magic.)

A(~isprime(A)) = 0

A =
     0     3     2    13
     5     0    11     0
     0     0     7     0
     0     0     0     0

Die Funktion find

Die Funktion find bestimmt die Indizes von Arrayelementen, die eine bestimmte logische Bedingung erfüllen. In ihrer einfachsten Form gibt find einen Spaltenvektor von Indizes zurück. Transponieren Sie diesen Vektor, um einen Zeilenvektor aus Indizes zu erhalten. Beginnen Sie zum Beispiel wieder mit dem magischen Quadrat von Dürer. (Siehe Die Funktion magic.)

k = find(isprime(A))'

wählt mithilfe eindimensionaler Indizierung die Positionen der Primzahlen im magischen Quadrat aus:

k =
     2     5     9    10    11    13

Zeigen Sie diese Primzahlen als Zeilenvektor in der Reihenfolge an, die von k bestimmt wird. Dabei gilt:

A(k)

ans =
     5     3     2    11     7    13

Wenn Sie k als linken Index in einer Zuweisungsanweisung verwenden, wird die Matrixstruktur beibehalten:

A(k) = NaN

A =
    16   NaN   NaN   NaN
   NaN    10   NaN     8
     9     6   NaN    12
     4    15    14     1