Subsections


3.6 Zugriff auf Teile von Matrizen, Indizierung

Sehr häufig ist es wichtig, auf bestimmte Teile einer Matrix in Abhängigkeit von ihrer Position in der Matrix zuzugreifen. Dazu braucht man die sogenannte Indizierung, die hier am Beispiel einer 2-dim Matrix erläutert werden soll. Bei höher dimensionalen Matrizen ist das Konzept analog anzuwenden.

In MATLAB bezieht sich der Befehl A(i,j) auf das Element $ a_{ij}$ der Matrix $ A$. Diese Bezeichnung ist praktisch in allen Programmiersprachen üblich. MATLAB bietet jedoch einen viel weitergehenden Aspekt der Indizierung, der es auf einfache Weise erlaubt auf bestimmte Regionen innerhalb einer Matrix zuzugreifen. Diese Eigenschaft macht die Matrix Manipulation einfacher als in vielen anderen Programmiersprachen. Außerdem bietet es eine einfache Möglichkeit die ``vektorisierte'' Natur von Berechnungen in MATLAB zu benutzen.

Die meisten Programme werden dadurch viel lesbarer und übersichtlicher, da man sich eine große Anzahl von Schleifen (und damit auch eine große Anzahl von Fehlerquellen) sparen kann.

In der Folge wird nun auf die verschiedenen Möglichkeiten der Indizierung eingegangen. In Tabelle 3.5 werden die einzelnen Regeln erläutert, und in 3.6 die Zuweisung von Werten gezeigt, und in 3.7 der Zugriff auf bestimmte Regionen gezeigt.


Table 3.5: Indizierung von Arrays
Index Alternative Zeilen Spalten Resultat
INDIZIERUNG MIT ZWEI INDICES
X(J,M)   J M Skalar
X(J,:) X(J,1:end) J ALLE Zeilenvektor
X(:,M) X(1:end,M) ALLE M Spaltenvektor
X(:,:) X(1:end,1:end) ALLE ALLE 2-D Array
X(J:K,M)   J:K M Spaltenvektor
X(J:D:K,M)   J:D:K M Spaltenvektor
X(J:K,M:N)   J:K M:N 2-D Array
INDIZIERUNG MIT EINEM INDEX (LINEAR)
X(:)   ALLE ALLE Spaltenvektor
X(I)   JI MI Skalar
X(I:H)   JI:JH MI:MH Zeilenvektor

Die Umrechnung zwischen dem linearen Index und mehrfachen Indices erfolgt mit den Befehlen ind2sub und sub2ind:

Mehrfacher Index von linearem Index:
[JI,MI] = ind2sub(size(X),I)
Linearer Index von mehrfachem Index:
[I] = sub2ind(size(X),JI,MI)
In beiden Befehlen muss natürlich die Größe, size(X), angegeben werden, da nur mit diesem Wissen der Zusammenhang zwischen den Indices eineindeutig ist. Wie bei dem Befehl sum folgt der lineare Index zuerst der ersten, dann der zweiten, dann der nächsten Dimension. Der Zusammenhang sollte aus folgender Darstellung klar werden,

$\displaystyle \left[ \begin{array}{cccc} (1,1) & (1,2) & (1,3) & (1,4)  (2,1)...
...0)  (2) & (5) & (8) & (11)  (3) & (6) & (9) & (12) \end{array} \right] \; .$ (3.3)


Table 3.6: Zuweisung von Werten an bestimmten Positionen eines Arrays
X X(3,2)=1 X(:,2)=1
\begin{displaymath}\begin{array}{cccc} 0 & 0 & 0 & 0  0 & 0 & 0 & 0  0 & 0 & 0 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 0 & 0 & 0  0 & 0 & 0 & 0  0 & 1 & 0 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 1 & 0 & 0  0 & 1 & 0 & 0  0 & 1 & 0 & 0 \end{array}\end{displaymath}
X(2,:)=1 X(:,:)=1 X(:)=1
\begin{displaymath}\begin{array}{cccc} 0 & 0 & 0 & 0  1 & 1 & 1 & 1  0 & 0 & 0 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 1 & 1 & 1  1 & 1 & 1 & 1  1 & 1 & 1 & 1 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 1 & 1 & 1  1 & 1 & 1 & 1  1 & 1 & 1 & 1 \end{array}\end{displaymath}
X(:,1:2:4)=1 X(1:2:3,:)=1 X(1:2:3,1:2:4)=1
\begin{displaymath}\begin{array}{cccc} 1 & 0 & 1 & 0  1 & 0 & 1 & 0  1 & 0 & 1 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 1 & 1 & 1  0 & 0 & 0 & 0  1 & 1 & 1 & 1 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 0 & 1 & 0  0 & 0 & 0 & 0  1 & 0 & 1 & 0 \end{array}\end{displaymath}
X(7:10)=1 X(1:2,3)=1 X(2,1:3)=1
\begin{displaymath}\begin{array}{cccc} 0 & 0 & 1 & 1  0 & 0 & 1 & 0  0 & 0 & 1 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 0 & 1 & 0  0 & 0 & 1 & 0  0 & 0 & 0 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 0 & 0 & 0  1 & 1 & 1 & 0  0 & 0 & 0 & 0 \end{array}\end{displaymath}


Table 3.7: Zugriff auf bestimmte Positionen eines Arrays
X X(3,2) X(:,2)
\begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 10 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 2  6  10 \end{array}\end{displaymath}
X(2,:) X(:,:) X(:)
\begin{displaymath}\begin{array}{cccc} 5 & 6 & 7 & 8 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 1  5  \vdots  8  12 \end{array}\end{displaymath}
X(:,1:2:4) X(1:2:3,:) X(1:2:3,1:2:4)
\begin{displaymath}\begin{array}{cc} 1 & 3  5 & 7  9 & 11 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cc} 1 & 3  9 & 11 \end{array}\end{displaymath}
X(7:10) X(1:2,3) X(2,1:3)
\begin{displaymath}\begin{array}{cccc} 3 & 7 & 11 & 4 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 3  7 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{ccc} 5 & 6 & 7 \end{array}\end{displaymath}

Da mit Hilfe der Doppelpunkt Notation ja eigentlich Vektoren als Indices erzeugt werden (3.4.2), ist natürlich auch folgende Schreibweise erlaubt:

Eine wichtige Rolle spielt auch das Keyword end, das im richtigen Kontext die entsprechende Größe angibt. Damit ist es nicht notwendig bei der Indizierung die Größe der Arrays zu kennen:


3.6.1 Logische Indizierung

In Ergänzung zur normalen Indizierung erlaubt MATLAB auch die sogenannte logische Indizierung mit Arrays die nur die Werte 1 (entspricht TRUE) bzw. 0 (entspricht FALSE) enthalten. Dadurch ist auch der Zugriff auf völlig ungeordnete Bereiche möglich (Tab.3.8).


Table 3.8: Zugriff mit Hilfe logischer Indizierung
X L X(L)
\begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 0 & 1 & 0  1 & 0 & 0 & 0  0 & 0 & 0 & 1 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 5  3  12 \end{array}\end{displaymath}
X L X(L)=0
\begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 0 & 1 & 0  1 & 0 & 0 & 0  0 & 0 & 0 & 1 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 2 & 0 & 4  0 & 6 & 7 & 8  9 & 10 & 11 & 0 \end{array}\end{displaymath}
X L X(L)
\begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 0 & 0 & 0  0 & 1 & 0 & 0  0 & 0 & 1 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{c} 1  6  11 \end{array}\end{displaymath}
X L X(L)=0
\begin{displaymath}\begin{array}{cccc} 1 & 2 & 3 & 4  5 & 6 & 7 & 8  9 & 10 & 11 & 12 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 1 & 0 & 0 & 0  0 & 1 & 0 & 0  0 & 0 & 1 & 0 \end{array}\end{displaymath} \begin{displaymath}\begin{array}{cccc} 0 & 2 & 3 & 4  5 & 0 & 7 & 8  9 & 10 & 0 & 12 \end{array}\end{displaymath}

Wichtig dabei ist Folgendes:


3.6.2 Beispiele zur Indizierung

Die vorliegenden Beispiele demonstrieren die Indizierung in MATLAB an Hand von 2-dimensionalen Matrizen. Jedes Element enthält dabei in der unteren linken Ecke den 2-D Index und in der rechten unteren Ecke den linearen Index. Erfolgt eine Zuweisung, bleibt die Form der Matrix erhalten, erfolgt jedoch keine Zuweisung werden die entsprechenden Elemente ausgeblendet. Ändert sich dabei die Form in einen Zeilen- oder Spaltenvektor, wird in der linken unteren Ecke Z oder S ausgegeben. Der lineare Index in der rechten unteren Ecke gibt dabei die Position im Vektor an und die Form der Darstellung hat keine Bedeutung mehr.


3.6.2.1 Zweidimensionale Indizierung

Zugriff auf Einzelelemente.
\includegraphics[width=\graphwidth]{appdata/mdi2single0ori} \includegraphics[width=\graphwidth]{appdata/mdi2single0} \includegraphics[width=\graphwidth]{appdata/mdi2single1}

Zugriff auf alle Zeilen in mehreren Spalten.
\includegraphics[width=\graphwidth]{appdata/mdi2spalte0ori} \includegraphics[width=\graphwidth]{appdata/mdi2spalte0} \includegraphics[width=\graphwidth]{appdata/mdi2spalte1}

Zugriff auf Spalten und Zeilen unter Verwendung des Keywortes end.
\includegraphics[width=\graphwidth]{appdata/mdi2zs0ori} \includegraphics[width=\graphwidth]{appdata/mdi2zs0} \includegraphics[width=\graphwidth]{appdata/mdi2zs1}

Zugriff auf Spalten und Zeilen unter Verwendung des Keywortes end.
\includegraphics[width=\graphwidth]{appdata/mdi2zsm0ori} \includegraphics[width=\graphwidth]{appdata/mdi2zsm0} \includegraphics[width=\graphwidth]{appdata/mdi2zsm1}

Zugriff auf die gesamte Matrix.
\includegraphics[width=\graphwidth]{appdata/mdi2all0ori} \includegraphics[width=\graphwidth]{appdata/mdi2all0} \includegraphics[width=\graphwidth]{appdata/mdi2all1}

Zugriff auf Spalten und Zeilen mit Vektoren.
\includegraphics[width=\graphwidth]{appdata/mdi2v0ori} \includegraphics[width=\graphwidth]{appdata/mdi2v0} \includegraphics[width=\graphwidth]{appdata/mdi2v1}


3.6.2.2 Lineare Indizierung

Zugriff auf Einzelelemente.
\includegraphics[width=\graphwidth]{appdata/mdi1single0ori} \includegraphics[width=\graphwidth]{appdata/mdi1single0} \includegraphics[width=\graphwidth]{appdata/mdi1single1}

Zugriff auf zusammenhängende Bereiche.
\includegraphics[width=\graphwidth]{appdata/mdi1cont0ori} \includegraphics[width=\graphwidth]{appdata/mdi1cont0} \includegraphics[width=\graphwidth]{appdata/mdi1cont1}

Zugriff auf nichtzusammenhängende Bereiche.
\includegraphics[width=\graphwidth]{appdata/mdi1br0ori} \includegraphics[width=\graphwidth]{appdata/mdi1br0} \includegraphics[width=\graphwidth]{appdata/mdi1br1}

Zugriff mit Hilfe eines beliebigen Vektors.
\includegraphics[width=\graphwidth]{appdata/mdi1v0ori} \includegraphics[width=\graphwidth]{appdata/mdi1v0} \includegraphics[width=\graphwidth]{appdata/mdi1v1}

Zugriff auf gesamte Matrix.
\includegraphics[width=\graphwidth]{appdata/mdi1c0ori} \includegraphics[width=\graphwidth]{appdata/mdi1c0} \includegraphics[width=\graphwidth]{appdata/mdi1c1}


3.6.2.3 Logische Indizierung

Zugriff auf Teile der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdlle0ori} \includegraphics[width=\graphwidth]{appdata/mdlle0log} \includegraphics[width=\graphwidth]{appdata/mdlle0}

Veränderung von Teilen der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdlle1ori} \includegraphics[width=\graphwidth]{appdata/mdlle1log} \includegraphics[width=\graphwidth]{appdata/mdlle1}

Zugriff auf Teile der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdland0ori} \includegraphics[width=\graphwidth]{appdata/mdland0log} \includegraphics[width=\graphwidth]{appdata/mdland0}

Veränderung von Teilen der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdland1ori} \includegraphics[width=\graphwidth]{appdata/mdland1log} \includegraphics[width=\graphwidth]{appdata/mdland1}

Zugriff auf Teile der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdland0ori} \includegraphics[width=\graphwidth]{appdata/mdland0log} \includegraphics[width=\graphwidth]{appdata/mdland0}

Veränderung von Teilen der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdland1ori} \includegraphics[width=\graphwidth]{appdata/mdland1log} \includegraphics[width=\graphwidth]{appdata/mdland1}

Zugriff auf Teile der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdlor0ori} \includegraphics[width=\graphwidth]{appdata/mdlor0log} \includegraphics[width=\graphwidth]{appdata/mdlor0}

Veränderung von Teilen der Matrix.
\includegraphics[width=\graphwidth]{appdata/mdlor1ori} \includegraphics[width=\graphwidth]{appdata/mdlor1log} \includegraphics[width=\graphwidth]{appdata/mdlor1}

Zugriff auf jene Teile der Matrix, die durch drei teilbar sind.
\includegraphics[width=\graphwidth]{appdata/mdlmod0ori} \includegraphics[width=\graphwidth]{appdata/mdlmod0log} \includegraphics[width=\graphwidth]{appdata/mdlmod0}

Veränderung von Teilen der Matrix, die nicht durch drei teilbar sind.
\includegraphics[width=\graphwidth]{appdata/mdlnmod0ori} \includegraphics[width=\graphwidth]{appdata/mdlnmod0log} \includegraphics[width=\graphwidth]{appdata/mdlnmod0}

Winfried Kernbichler 2005-04-26