Arraytypen
Mehrdimensionale Arrays
Mehrdimensionale Arrays in der MATLAB® Umgebung sind Arrays mit mehr als zwei Indexzeichen. Eine Möglichkeit zum Erstellen eines mehrdimensionalen Arrays ist das Aufrufen von zeros
, ones
, rand
oder randn
mit mehr als zwei Argumenten. Beispielsweise erstellt
R = randn(3,4,5);
ein 3x4x5-Array mit insgesamt 3*4*5 = 60
normal verteilten Zufallselementen.
Ein dreidimensionales Array könnte dreidimensionale physikalische Daten darstellen, zum Beispiel die Temperatur in einem Raum, die auf einem rechteckigen Raster stichprobenartig abgefragt wird. Alternativ könnte es eine Folge von Matrizen darstellen, A(k), oder Stichproben einer zeitabhängigen Matrix, A(t). In letzteren Fällen wird das (i, j). Element der k. Matrix oder die tk. Matrix wie folgt angezeigt: A(i,j,k)
.
MATLAB und die Versionen des magischen Quadrats der vierten Ordnung von Albrecht Dürer unterscheiden sich durch zwei vertauschte Spalten. Durch das Vertauschen von Spalten lassen sich viele verschiedene magische Quadrate generieren. Die Anweisung
p = perms(1:4);
generiert die 4! = 24 Permutationen von 1:4
. Die k
. Permutation ist der Zeilenvektor p(k,:)
. Anschließend speichert
A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:)); end
die Folge von 24 magischen Quadraten in einem dreidimensionalen Array, M
. Die Größe von M
ist
size(M) ans = 4 4 24
Hinweis
Die Reihenfolge der Matrizen in dieser Abbildung kann sich von Ihren Ergebnissen unterscheiden. Die Funktion perms
gibt stets alle Permutationen des Eingangsvektors zurück, doch die Reihenfolge der Permutationen kann sich in verschiedene Versionen von MATLAB unterscheiden.
Die Anweisung
sum(M,d)
berechnet Summen durch Abwandlung des d
. Indexzeichens. Daher ist
sum(M,1)
ein 1x4x24-Array, das 24 Kopien des Zeilenvektors enthält,
34 34 34 34
und
sum(M,2)
ist ein 4x1x24-Array, das 24 Kopien des Spaltenvektors enthält
34 34 34 34
Schließlich addiert
S = sum(M,3)
die 24 Matrizen in der Folge. Das Ergebnis hat die Größe 4x4x1, sodass es wie ein 4x4-Array aussieht:
S = 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204
Zellenarrays
Zellenarrays in MATLAB sind mehrdimensionale Arrays, deren Elemente Kopien anderer Arrays sind. Ein Zellenarray leerer Matrizen kann mit der Funktion cell
erstellt werden. Doch häufiger werden Zellenarrays erstellt, indem verschiedene Elemente in geschwungenen Klammern, {}
, eingeschlossen werden. Die geschwungenen Klammern werden auch mit Indexzeichen verwendet, um auf die Inhalte verschiedener Zellen zuzugreifen. Beispielsweise erstellt
C = {A sum(A) prod(prod(A))}
ein 1x3-Zellenarray. Die drei Zellen enthalten das magische Quadrat, den Zeilenvektor der Spaltensummen und das Produkt aller seiner Elemente. Wenn C
angezeigt wird, sehen Sie Folgendes:
C = [4x4 double] [1x4 double] [20922789888000]
Dies liegt daran, dass die beiden ersten Zellen zu groß sind und der Platz zum Drucken nicht ausreicht. Die dritte Zelle enthält jedoch nur eine einzige Zahl, 16!, sodass ausreichend Platz zum Drucken gegeben ist.
Die beiden folgenden Punkte müssen stets berücksichtigt werden: Erstens müssen zum Abrufen des Inhalts einer der Zellen Indexzeichen in geschwungenen Klammern verwendet werden. Beispielsweise wird mit C{1}
das magische Quadrat abgerufen und C{3}
ist 16!. Zweitens enthalten Zellenarrays Kopien anderer Arrays und keine Zeiger auf diese Arrays. Wenn Sie anschließend A
ändern, bleibt C
unverändert.
Sie können dreidimensionale Arrays verwenden, um eine Folge von Matrizen derselben Größe zu speichern. Zellenarrays können verwendet werden, um eine Folge von Matrizen verschiedener Größen zu speichern. Beispielsweise erstellt
M = cell(8,1); for n = 1:8 M{n} = magic(n); end M
eine Folge magischer Quadrate unterschiedlicher Ordnung:
M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]
Sie können die 4x4-Matrix des magischen Quadrats wie folgt abrufen:
M{4}
Zeichen und Text
Wenn Sie in MATLAB Text eingeben, müssen Sie diesen in einfache Anführungszeichen einschließen. Beispiel:
s = 'Hello'
Das Ergebnis unterscheidet sich von den numerischen Matrizen bzw. Arrays, mit denen Sie bisher gearbeitet haben. Es handelt sich um ein 1x5-Zeichenarray.
Intern werden die Zeichen zwar als Zahlen gespeichert, nicht jedoch im Gleitkommaformat. Die Anweisung
a = double(s)
konvertiert das Zeichenarray in eine numerische Matrix, die Gleitkommadarstellungen der ASCII-Codes für jedes Zeichen enthält. Das Ergebnis ist
a = 72 101 108 108 111
Mithilfe der Anweisung
s = char(a)
wird die Konvertierung rückgängig gemacht.
Wenn Sie Zahlen in Zeichen konvertieren, können Sie die verschiedenen Schriftarten ausprobieren, die auf Ihrem Computer verfügbar sind. Die druckbaren Zeichen im grundlegenden ASCII-Zeichensatz werden von den Ganzzahlen 32:127
dargestellt. (Ganzzahlen kleiner als 32 stellen nicht druckbare Steuerzeichen dar.) Diese Ganzzahlen sind in einem entsprechenden 6x16-Array angeordnet:
F = reshape(32:127,16,6)';
Die druckbaren Zeichen im erweiterten ASCII-Zeichensatz werden durch F+128
dargestellt. Wenn diese Ganzzahlen als Zeichen interpretiert werden, hängt das Ergebnis von der verwendeten Schriftart ab. Geben Sie die Anweisungen
char(F) char(F+128)
ein und ändern Sie anschließend die Schriftart, die für das Befehlsfenster verwendet wird. Klicken Sie zum Ändern der Schriftart auf der Registerkarte Home im Abschnitt Environment auf Preferences > Fonts. Wenn Ihre Codezeilen Tabulatoren enthalten, verwenden Sie eine nichtproportionale Schriftart wie zum Beispiel Monospaced
, um die Tabulatorpositionen in verschiedenen Zeilen auszurichten.
Durch eine Verknüpfung mit eckigen Klammern werden Textvariablen miteinander verbunden. Mithilfe der Anweisung
h = [s, ' world']
werden die Zeichen horizontal verbunden und ergeben
h = Hello world
Mithilfe der Anweisung
v = [s; 'world']
werden die Zeichen vertikal verbunden und ergeben
v = Hello world
Beachten Sie, dass ein Leerzeichen vor dem 'w'
in h
eingefügt werden muss und dass beide Wörter in v
dieselbe Länge aufweisen müssen. Die sich daraus ergebenden Arrays sind jeweils Zeichenarrays. h
ist ein 1x11-Array und v
ein 2x5-Array.
Zum Manipulieren eines Textkörpers, der Zeilen unterschiedlicher Länge enthält, stehen Ihnen zwei Möglichkeiten zur Verfügung: ein aufgefülltes Zeichenarray oder ein Zellenarray mit Zeichenvektoren. Wenn Sie ein Zeichenarray erstellen, muss jede Zeile des Arrays dieselbe Länge aufweisen. (Das Ende der kürzeren Zeilen wird mit Leerzeichen aufgefüllt.) Die Funktion char
übernimmt dieses Auffüllen für Sie. Beispielsweise erstellt
S = char('A','rolling','stone','gathers','momentum.')
ein 5x9-Zeichenarray:
S = A rolling stone gathers momentum.
Alternativ können Sie den Text in einem Zellenarray speichern. Beispielsweise erstellt
C = {'A';'rolling';'stone';'gathers';'momentum.'}
ein 5x1-Zellenarray, das nicht aufgefüllt werden muss, da jede Zeile des Arrays unterschiedliche Längen aufweisen kann:
C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'
Sie können ein aufgefülltes Zeichenarray wie folgt in ein Zellenarray mit Zeichenvektoren konvertieren:
C = cellstr(S)
Und Sie können den Prozess wie folgt umkehren:
S = char(C)
Strukturen
Strukturen sind mehrdimensionale MATLAB Arrays mit Elementen, auf die Textfeldkennzeichner zugreifen. Beispielsweise erstellt
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
eine skalare Struktur mit drei Feldern:
S = name: 'Ed Plum' score: 83 grade: 'B+'
Wie alles andere in der MATLAB Umgebung sind auch Strukturen Arrays, sodass Sie zusätzliche Elemente einfügen können. In diesem Fall ist jedes Element des Arrays eine Struktur mit mehreren Feldern. Die Felder können nacheinander hinzugefügt werden:
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
oder es kann ein ganzes Element mit einer einzelnen Anweisung hinzugefügt werden:
S(3) = struct('name','Jerry Garcia',... 'score',70,'grade','C')
Jetzt ist die Struktur groß genug, dass nur eine Zusammenfassung gedruckt wird:
S = 1x3 struct array with fields: name score grade
Es gibt mehrere Möglichkeiten, die verschiedenen Felder in anderen MATLAB Arrays wieder zusammenzusetzen. Sie basieren meist auf der Schreibweise einer durch Kommas getrennten Liste. Wenn Sie
S.score
eingeben, ist dies identisch mit der folgenden Eingabe:
S(1).score, S(2).score, S(3).score
Hierbei handelt es sich um eine durch Kommas getrennte Liste.
Wenn Sie den Ausdruck, mit dem eine solche Liste generiert wird, in eckige Klammern einschließen, speichert MATLAB jedes Element aus der Liste in einem Array. In diesem Beispiel erstellt MATLAB einen numerischen Zeilenvektor, der das Feld score
jedes Elements des Strukturarrays S
enthält:
scores = [S.score] scores = 83 91 70 avg_score = sum(scores)/length(scores) avg_score = 81.3333
Zum Erstellen eines Zeichenarrays aus einem der Textfelder (zum Beispiel name
) rufen Sie die Funktion char
in der durch Kommas getrennten Liste auf, die von S.name
erstellt wurde:
names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia
Auf ähnliche Weise können Sie ein Zellenarray aus den name
-Feldern erstellen, indem Sie den Ausdruck, der die Liste generiert, in geschwungene Klammern einschließen:
names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'
Wenn Sie die Felder jedes Elements eines Strukturarrays außerhalb der Struktur zuweisen möchten, geben Sie jede Ausgabe links neben dem Gleichheitszeichen an und schließen Sie alles in eckige Klammern ein:
[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
Dynamische Feldnamen
Die gängigste Art, auf Daten in einer Struktur zuzugreifen, ist die Angabe des Namens für das Feld, das Sie referenzieren möchten. Eine weitere Möglichkeit, auf Daten in einer Struktur zuzugreifen, ist die Verwendung dynamischer Feldnamen. Diese Namen drücken das Feld als Variablenausdruck aus, den MATLAB während der Laufzeit auswertet. Mit der hier abgebildeten Punkt-Klammer-Syntax wird expression
zu einem dynamischen Feldnamen:
structName.(expression)
Erstellen Sie in diesem Feld einen Index und verwenden Sie dabei die Standardindizierungssyntax von MATLAB. Wenn Sie zum Beispiel expression
in einen Feldnamen auswerten und die Werte dieses Felds in den Spalten 1
bis 25
der Zeile 7
erhalten möchten, geben Sie Folgendes ein:
structName.(expression)(7,1:25)
Beispiel für dynamische Feldnamen. Die im Folgenden abgebildete Funktion avgscore
berechnet ein durchschnittliches Testergebnis und ruft dabei Informationen aus der Struktur testscores
unter Verwendung dynamischer Feldnamen ab:
function avg = avgscore(testscores, student, first, last) for k = first:last scores(k) = testscores.(student).week(k); end avg = sum(scores)/(last - first + 1);
Sie können diese Funktion mit unterschiedlichen Werten für das dynamische Feld student
ausführen. Initialisieren Sie zunächst die Struktur, die Testergebnisse für einen Zeitraum von 25 Wochen enthält:
testscores.Ann_Lane.week(1:25) = ... [95 89 76 82 79 92 94 92 89 81 75 93 ... 85 84 83 86 85 90 82 82 84 79 96 88 98]; testscores.William_King.week(1:25) = ... [87 80 91 84 99 87 93 87 97 87 82 89 ... 86 82 90 98 75 79 92 84 90 93 84 78 81];
Führen Sie jetzt avgscore
aus und geben Sie während der Laufzeit die Namensfelder mit den Studentennamen für die Struktur testscores
mithilfe dynamischer Feldnamen an:
avgscore(testscores, 'Ann_Lane', 7, 22) ans = 85.2500 avgscore(testscores, 'William_King', 7, 22) ans = 87.7500