Array-Indizierung
In MATLAB® gibt es drei Hauptansätze zum Zugriff auf Array-Elemente auf Basis ihrer Position (Index) im Array. Diese Ansätze sind Indizierung nach Position, lineare Indizierung und logische Indizierung. Sie können auch eine gemischte Indizierung verwenden, indem Sie die positionsbezogene und die logische Indizierung kombinieren.
Indizierung nach Elementposition
Der gängigste Ansatz ist die ausdrückliche Angabe der Indizes der Elemente. Um beispielsweise auf ein einzelnes Element einer Matrix zuzugreifen, geben Sie die Zeilennummer des Elements gefolgt von seiner Spaltennummer an.
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = 4×4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
e = A(3,2)
e = 10
e
ist das Element an Position 3,2 (dritte Zeile, zweite Spalte) von A
.
Sie können zudem mehrere Elemente zugleich referenzieren, indem Sie ihre Indizes mit einem Vektor angeben. Beispielsweise können Sie auf das erste und das dritte Element in der zweiten Zeile von A
zugreifen.
r = A(2,[1 3])
r = 1×2
5 7
Um auf Elemente in einem Zeilen- oder Spaltenbereich zuzugreifen, verwenden Sie den Operator colon
. Beispielsweise können Sie auf die Elemente in der ersten bis einschließlich dritten Zeile und zweiten bis einschließlich vierten Spalte von A
zugreifen.
r = A(1:3,2:4)
r = 3×3
2 3 4
6 7 8
10 11 12
Eine alternative Methode, auf diese Elemente zuzugreifen, besteht darin, das Schlüsselwort end
zu verwenden, um die letzte Spalte anzugeben. So können Sie die letzte Spalte angeben, auch wenn Sie die genaue Anzahl der Spalten in A
nicht kennen.
r = A(1:3,2:end)
r = 3×3
2 3 4
6 7 8
10 11 12
Wenn Sie auf alle Zeilen oder Spalten zugreifen möchten, verwenden Sie nur den Doppelpunkt-Operator. Geben Sie zum Beispiel die gesamte dritte Zeile von A
zurück.
r = A(3,:)
r = 1×4
9 10 11 12
Sie können auch auf die vorletzte Spalte von A
zugreifen, indem Sie den Doppelpunkt-Operator und das Schlüsselwort end
verwenden.
r = A(:,end-1)
r = 4×1
3
7
11
15
Im Allgemeinen können Sie mittels Indizierung auf Elemente in beliebigen Arrays in MATLAB zugreifen, unabhängig von Datentyp oder Dimensionen. Sie können beispielsweise direkt auf eine Spalte eines datetime
-Arrays zugreifen.
t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2×5 datetime
01-Jan-2018 01-Feb-2018 01-Mar-2018 01-Apr-2018 01-May-2018
01-Jan-2019 01-Feb-2019 01-Mar-2019 01-Apr-2019 01-May-2019
march1 = t(:,3)
march1 = 2×1 datetime
01-Mar-2018
01-Mar-2019
Für Arrays mit höheren Dimensionen können Sie die Syntax gemäß den Array-Dimensionen erweitern. Nehmen wir beispielsweise ein numerisches 3x3x3-Array. Greifen Sie auf das Element in der zweiten Zeile, dritten Spalte und im ersten Blatt des Arrays zu.
A = rand(3,3,3); e = A(2,3,1)
e = 0.5469
Weitere Informationen zum Arbeiten mit mehrdimensionalen Arrays finden Sie unter Mehrdimensionale Arrays.
Indizierung nach einzigem Index
Ein anderer Ansatz für den Zugriff auf Elemente eines Arrays ist die Verwendung von nur einem Index, unabhängig von der Größe oder den Dimensionen des Arrays. Dieser Ansatz wird als lineare Indizierung bezeichnet. Während MATLAB Arrays entsprechend ihrer definierten Größe und Form anzeigt, werden sie im Speicher tatsächlich spaltenweise, von links nach rechts, gespeichert. Dieses Konzept lässt sich gut mit einer Matrix visualisieren. Das folgende Array wird zwar als 3x3-Matrix angezeigt, MATLAB speichert es jedoch als eine einzige Spalte, in der die Spalten von A
aneinandergereiht sind. Der gespeicherte Vektor enthält die Elementreihenfolge 12
, 45
, 33
, 36
, 29
, 25
, 91
, 48
, 11
und kann mit einem einzelnen Doppelpunkt angezeigt werden.
A = [12 36 91; 45 29 48; 33 25 11]
A = 3×3
12 36 91
45 29 48
33 25 11
Alinear = A(:)
Alinear = 9×1
12
45
33
36
29
25
91
48
11
Das Element 3,2 von A
ist 25
und Sie können mithilfe der Syntax A(3,2)
darauf zugreifen. Sie können zudem mithilfe der Syntax A(6)
auf das Element zugreifen, da 25
das sechste Element der gespeicherten Vektorsequenz ist.
e = A(3,2)
e = 25
elinear = A(6)
elinear = 25
Eine lineare Indizierung mag visuell weniger intuitiv sein, ist aber bei bestimmten Berechnungen, die nicht von der Form oder Größe des Arrays abhängen, sehr leistungsfähig. Beispielsweise können Sie einfach alle Elemente von A
summieren, ohne der Funktion sum
ein zweites Argument zu übergeben.
s = sum(A(:))
s = 330
Mit den Funktionen sub2ind
und ind2sub
können Sie die ursprünglichen Array-Indizes in lineare Versionen konvertieren und umgekehrt. Berechnen Sie beispielsweise den linearen Index des Elements 3,2 von A
.
linearidx = sub2ind(size(A),3,2)
linearidx = 6
Konvertieren Sie den linearen Index wieder in Zeilen-Spalten-Form zurück.
[row,col] = ind2sub(size(A),6)
row = 3
col = 2
Indizierung nach logischen Werten
Logische Wahr- und Falsch-Indikatoren sind ein weiterer nützlicher Ansatz, um Arrays zu indizieren, besonders dann, wenn Sie mit bedingten Anweisungen arbeiten. Nehmen wir beispielsweise an, dass Sie ermitteln möchten, ob die Elemente einer Matrix A
kleiner als die entsprechenden Elemente einer anderen Matrix B
sind. Der Kleiner-als-Operator gibt ein logisches Array aus, dessen Elemente 1
sind, wenn ein Element in A
kleiner als das entsprechende Element in B
ist.
A = [1 2 6; 4 3 6]
A = 2×3
1 2 6
4 3 6
B = [0 3 7; 3 7 5]
B = 2×3
0 3 7
3 7 5
ind = A < B
ind = 2×3 logical array
0 1 1
0 1 0
Da Sie nun die Positionen der Elemente kennen, die die Bedingung erfüllen, können Sie die einzelnen Werte mithilfe von ind
als Index-Array betrachten. MATLAB gleicht die Positionen von Wert 1 in ind
mit den entsprechenden Elementen in A
und B
ab und führt die Werte in einem Spaltenvektor auf.
Avals = A(ind)
Avals = 3×1
2
3
6
Bvals = B(ind)
Bvals = 3×1
3
7
7
Die „is
“-Funktionen von MATLAB geben ebenfalls logische Arrays aus, die angeben, welche Elemente der Eingabe eine bestimmte Bedingung erfüllen. Beispielsweise können Sie mithilfe der Funktion ismissing
prüfen, welche Elemente eines Zeichenfolgenvektors fehlen.
str = ["A" "B" missing "D" "E" missing]; ind = ismissing(str)
ind = 1×6 logical array
0 0 1 0 0 1
Nehmen wir an, dass Sie die Werte der nicht fehlenden Elemente ermitteln möchten. Hierfür können Sie den Operator ~
und den Index-Vektor ind
verwenden.
strvals = str(~ind)
strvals = 1×4 string
"A" "B" "D" "E"
Weitere Beispiele zur logischen Indizierung finden Sie unter Auffinden von Array-Elementen, die Bedingungen erfüllen.
Gemischte Indizierung nach logischen Werten und Elementpositionen
Sie können auch eine Kombination aus positionsbezogener und logischer Indizierung verwenden, um auf Array-Elemente zuzugreifen.
Erstellen Sie beispielsweise eine 5x5-Matrix.
A = magic(5)
A = 5×5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Angenommen, Sie möchten die Elemente von A auswählen, die sich in Zeilen mit Primzahlindizes und in Spalten mit den Indizes 2, 3 und 4 befinden.
Erstellen Sie dazu den Vektor B
, der die Indizes der Zeilen in A
darstellt.
B = (1:size(A,1))
B = 1×5
1 2 3 4 5
Verwenden Sie die Funktion isprime
, um zu bestimmen, welche Elemente in B
unteilbar sind. Das Ergebnis ist ein logisches Array, das Sie für eine Indizierung in den Zeilen von A
verwenden können.
rows = isprime(B)
rows = 1×5 logical array
0 1 1 0 1
Definieren Sie als Nächstes die Spalten, die Sie auswählen möchten und die sich an den Positionen 2 bis 4 befinden.
cols = 2:4
cols = 1×3
2 3 4
Verwenden Sie die logische Indizierung, um die Zeilen von A
auszuwählen, die sich an Primzahlpositionen befinden, wie es durch rows
definiert ist. Verwenden Sie dann die Indizierung nach Position, um die Spalten von A
im Bereich der Positionen 2 bis 4 auszuwählen, wie durch cols
definiert.
A(rows,cols)
ans = 3×3
5 7 14
6 13 20
18 25 2
Siehe auch
Themen
- Access Data Using Categorical Arrays
- Access Data in Tables
- Struktur-Arrays
- Zugreifen auf Daten in einem Zellen-Array
- Indexed Assignment
- Detailed Rules for Array Indexing