Technische Artikel

MathWorks Insights

Matrix-Indizierung in MATLAB


Autoren:

  • Steve Eddins, MathWorks
  • Loren Shure, MathWorks

8 Minuten Lesezeit

Schlagwörter:

Zusammenfassung

  • Die Matrix-Indizierung ermöglicht die effiziente Auswahl und Änderung von Daten und bildet die Grundlage für die Bearbeitung von Arrays und für matrixbasierte Algorithmen.
  • MATLAB unterstützt mehrere Indizierungsarten, darunter die Indizierung mit einzelnen Indizes und mit Indexvektoren sowie den Doppelpunkt-Operator und das Schlüsselwort „end“ für den Zugriff auf Bereiche und Randelemente.
  • Die Indizierung unterstützt sowohl die Extraktion als auch die Zuweisung und ermöglicht damit kompakte Transformationen wie das Umordnen von Elementen, das Ersetzen von Werten und Operationen auf Teilarrays.
  • Eine effektive Indizierung ist die Grundlage der Vektorisierung. Sie verringert die Abhängigkeit von Schleifen und ermöglicht die Erstellung von Code, der in der Regel kürzer, klarer und schneller ist.

Die Indizierung einer Matrix ist ein Mittel, um eine Teilmenge der Elemente dieser Matrix auszuwählen oder zu ändern. MATLAB® bietet mehrere Indizierungsarten, die nicht nur leistungsfähig und flexibel, sondern auch gut lesbar und ausdrucksstark sind. Matrizen sind ein zentraler Bestandteil von MATLAB für die Organisation und Analyse von Daten. Die Indizierung ist der Schlüssel dazu, Matrizen effektiv und auf verständliche Weise zu bearbeiten.

Zudem ist die Indizierung eng mit einem weiteren Begriff verbunden, dem MATLAB-Anwender häufig begegnen: der Vektorisierung. Vektorisierung bedeutet, anstelle von skalaren Operationen die Matrix- und Vektoroperationen von MATLAB zu verwenden. Dies führt in der Regel dazu, dass der resultierende Code kürzer, mathematisch ausdrucksstärker und besser lesbar sowie manchmal auch schneller ist.

Vektorindizierung

Beginnen wir mit dem einfachen Fall eines Vektors und seiner Indizes.

 v = [16 5 9 4 2 11 7 14];

Der Index kann ein einzelner Wert sein:

 v(3) % Extract the third element
 ans =
 9

Ein Index kann aber auch selbst ein weiterer Vektor sein.

 v([1 5 6]) % Extract the first, fifth, and sixth elements
 ans =
 16 2 11

Die Doppelpunktnotation in MATLAB bietet eine einfache Möglichkeit, einen Bereich von Elementen aus v zu extrahieren.

 v(3:7) % Extract the third through the seventh elements
 ans =
 9 4 2 11 7

Vertauschen Sie die beiden Hälften von v, um einen neuen Vektor zu erzeugen.

 v2 = v([5:8 1:4]) % Extract and swap the halves of v
 v2 =
 2 11 7 14 16 5 9 4

Der spezielle Operator end ist eine einfache Kurzschreibweise, um auf das letzte Element von v zu verweisen.

 v(end) % Extract the last element
 ans =
 14

Zudem kann der Operator end in einem Bereich verwendet werden.

 v(5:end) % Extract the fifth through the last elements
 ans =
 2 11 7 14

Sie können end sogar für Berechnungen verwenden.

 v(2:end-1) % Extract the second through the next-to-last elements
 ans =
 5 9 4 2 11 7

Kombinieren Sie den Doppelpunktoperator mit end, um verschiedenste Effekte zu erzielen, etwa jedes k-te Element zu extrahieren oder den gesamten Vektor umzukehren.

 v(1:2:end) % Extract all the odd elements
 ans =
 16 9 2 7
 v(end:-1:1) % Reverse the order of elements
 ans =
 14 7 11 2 4 9 5 16

Mit einem Indizierungsausdruck auf der linken Seite des Gleichheitszeichens können Sie bestimmte Elemente des Vektors ersetzen.

 v([2 3 4]) = [10 15 20] % Replace some elements of v
 v =
 16 10 15 20 2 11 7 14

Normalerweise muss die Anzahl der Elemente auf der rechten Seite mit der Anzahl der Elemente übereinstimmen, auf die der Indizierungsausdruck auf der linken Seite verweist. Auf der rechten Seite können Sie jedoch immer einen Skalar verwenden. Dies wird als skalare Erweiterung bezeichnet.

 v([2 3]) = 30 % Replace second and third elements by 30
 v =
 16 30 30 20 2 11 7 14

Beachten Sie: MATLAB verwendet eine 1-basierte Indizierung. Manche Sprachen beginnen bei der Indizierung einer Matrix bei null. Andere Sprachen, wie MATLAB, beginnen bei 1. MATLAB folgt derselben Notation, die Ihnen vermutlich aus mathematischen Lehrbüchern bekannt ist. Warum beginnt MATLAB bei 1? Cleve Moler, der Begründer von MATLAB, erklärt dazu: „So macht es die Mathematik.“

Indizierung von Matrizen mit zwei Indizes

Betrachten wir nun die Indizierung einer Matrix. Für unsere Beispiele verwenden wir ein magisches Quadrat.

 A = magic(4)
 A =
 16 2 3 13
 5 11 10 8
 9 7 6 12
 4 14 15 1

Meistens werden Matrizen mit zwei Indizes indiziert, wobei der erste Index für die Zeilen und der zweite für die Spalten steht.

Die einfachste Form wählt ein einzelnes Element aus.

 A(2,4) % Extract the element in row 2, column 4
 ans =
 8

Ganz allgemein können einer oder beide Indizes Vektoren sein.

 A(2:4,1:2)
 ans =
 5 11
 9 7
 4 14

Ein einzelnes „:“ an einer Indexposition ist eine Kurzschreibweise für „1:end“ und wird häufig verwendet, um ganze Zeilen oder Spalten auszuwählen.

 A(3,:) % Extract third row
 ans =
 9 7 6 12
 A(:,end) % Extract last column
 ans =
 13
 8
 12
 1

Manchmal herrscht Unklarheit darüber, wie sich verstreute Elemente aus einer Matrix auswählen lassen. Angenommen, Sie möchten die Elemente (2,1), (3,2) und (4,4) aus A extrahieren.

4x4-Matrix mit drei hervorgehobenen Werten, die an verschiedenen Stellen in der Matrix verstreut sind. Sie befinden sich in Zeile 2, Spalte 1, in Zeile 3, Spalte 2 und in Zeile 4, Spalte 4.

Verstreute Elemente in einer Matrix.
Wie würden wir diese gewünschte Ausgabe notieren?

Der Ausdruck A([2 3 4], [1 2 4]) liefert nicht das gewünschte Ergebnis. Dieses Diagramm veranschaulicht, wie die Indizierung mit zwei Indizes funktioniert.

Das Extrahieren verstreuter Elemente aus einer Matrix erfordert eine andere Art der Indizierung, womit wir bei unserem nächsten Thema wären.

Lineare Indizierung

Was bewirkt der Ausdruck A(14)?

Wenn Sie die Matrix A mit nur einem Index indizieren, behandelt MATLAB A so, als wären ihre Elemente zu einem langen Spaltenvektor aneinandergereiht, wobei die Spalten wie in folgendem Beispiel nacheinander von oben nach unten durchlaufen werden:

16
5
9
...
8
12
1

Tipp: MATLAB speichert spaltenweise, sodass die Spalten bei der linearen Indizierung nacheinander von oben nach unten durchlaufen werden.

Der Ausdruck A(14) extrahiert ganz einfach das 14. Element dieses impliziten Spaltenvektors. Diese Art der Indizierung einer Matrix mit einem einzigen Index wird häufig als lineare Indizierung bezeichnet.

Aus dem Diagramm, das die linearen Indizes in der linken oberen Ecke jedes Matrixelements zeigt, können Sie erkennen, dass A(14) dasselbe ist wie A(2,4).

Wie in folgendem Beispiel kann der einzelne Index auch ein Vektor mit mehr als einem linearen Index sein:

 A([6 12 15])
 ans =
 11 15 12

Betrachten wir noch einmal das Problem, nur die Elemente (2,1), (3,2) und (4,4) von A extrahieren zu wollen. Mit der linearen Indizierung können Sie dies tun.

 A([2 7 16])
 ans =
 5 7 1

In diesem Beispiel ist dies leicht zu erkennen. Aber wie lassen sich lineare Indizes im Allgemeinen berechnen? MATLAB bietet die Funktion sub2ind, die Zeilen- und Spaltenindizes in lineare Indizes umwandelt. Damit können Sie die gewünschten Elemente wie folgt extrahieren:

 idx = sub2ind(size(A), [2 3 4], [1 2 4])
 ans =
 2 7 16
 A(idx)
 ans =
 5 7 1

Logische Indizierung

Eine weitere Variante ist die logische Indizierung. Diese stellt eine kompakte und ausdrucksstarke Notation dar, die in vielen Anwendungen nützlich ist, unter anderem in der Bildverarbeitung. Bei der logischen Indizierung verwenden Sie ein einzelnes logisches Array als Matrixindex.

Hier ist ein Beispiel für ein logisches Array, das Sie verwenden könnten:

A > 12 

ans =
4×4 logical array

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

Dies sind die Stellen in der Matrix, an denen der logische Ausdruck wahr ist, in diesem Fall also alle Stellen mit einem Wert größer als 12.

Der Ausdruck A(A > 12) extrahiert die Matrixelemente, die den Werten ungleich null im logischen Array entsprechen. Die Ausgabe erfolgt immer in Form eines Spaltenvektors.

A(A > 12) 

ans =

 16
 14
 15
 13

Viele MATLAB-Funktionen, die mit is beginnen, geben logische Arrays zurück und sind für die logische Indizierung sehr nützlich. Beispielsweise können Sie mit einer einzigen Codezeile alle NaN-Elemente in einem Array durch einen anderen Wert ersetzen, indem Sie isnan, logische Indizierung und skalare Erweiterung kombinieren.

 B(isnan(B)) = 0

MATLAB verfügt über viele Funktionen für String-Arrays, die logische Arrays zurückgeben, darunter contains, startsWith und matches. Damit können Sie Text mithilfe der logischen Indizierung verarbeiten. Beispielsweise könnten Sie alle Namen von Raumfahrtprogrammen extrahieren, die „Skylab“ enthalten.

>> names

names =

  6×1 string array

    "Mercury"
    "Gemini"
    "Apollo"
    "Skylab"
    "Skylab B"
    "ISS"

>> names(contains(names,"Skylab"))

ans =

  2×1 string array

    "Skylab"
    "Skylab B"

Die logische Indizierung ist eng mit der Funktion find verwandt. Der Ausdruck A(A > 5) ist äquivalent zu A(find(A > 5)). Der Ausdruck mit logischer Indizierung ist in einfachen Fällen schneller, aber find bietet sich an, wenn Sie die Indexwerte an anderer Stelle der Berechnung benötigen. Angenommen, Sie möchten NaN-Werte vorübergehend durch Nullen ersetzen, eine Berechnung durchführen und die NaN-Werte anschließend wieder an ihre ursprünglichen Stellen einsetzen. In diesem Beispiel besteht die Berechnung aus einer zweidimensionalen Filterung mit filter2. Dies funktioniert folgendermaßen:

 nan_locations = find(isnan(A)); 

 A(nan_locations) = 0; 

 A = filter2(ones(3,3), A); 

 A(nan_locations) = NaN; 

Wir hoffen, dass Ihnen die Beispiele in diesem Artikel ein Gefühl dafür vermittelt haben, wie Sie Algorithmen kompakt und effizient ausdrücken können. Wenn Sie diese Techniken und die zugehörigen Funktionen in Ihr Repertoire für die MATLAB-Programmierung aufnehmen, erweitern Sie Ihre Möglichkeiten, prägnanten, gut lesbaren und vektorisierten Code zu erstellen.

Veröffentlicht 2024


Eingesetzte Produkte: MATLAB

Mehr entdecken