| K. Taubert, W. Wiedl: MATLAB Datenstrukturen |
Die einzelnen Elemente oder Komponenten einer Datenstruktur können skalare Daten oder wiederum Datenstrukturen sein.
Wir kennen in Matlab bisher nur eine skalare Datenart, die Zahlen, wobei
kein Unterschied zwischen reellen und komplexen Zahlen gemacht wird.
Die einzelnen Feldelemente werden durch ihre spezifischen Indexwerte
identifiziert, in Beispiel 1 hat das Element A(2,3) z.B. den Wert 10.
Als Besonderheit von Matlab (matrix laboratory) ist anzumerken, daß
das grundlegende Bauelement, aus denen Zahlenfelder aufgebaut werden
nicht das Skalar, sondern die Matrix ist. Wir unterscheiden deshalb
noch einmal zwischen Matrizen einerseits und h&oouml;herdimensionalen
Feldern andererseits, das sind Felder der Dimension 3 und mehr.
Matlab kennt noch eine Reihe weiterer Funktionen deren Aufruf Felder mit speziellen Werten
liefern, für die Abhängigkeit der Gestalt des erzeugten Feldes von den Argumentwerten
gilt dasselbe wie bei rand.
Speziell zur Konstruktion von Zeilenvektoren dienen die Funktionen:
Eine genauere Beschreibung erhalten Sie mit dem help-Kommando.
Die Dimension eines Feldes kann man mit der Funktion ndims(Feld)
abfragen, die Gestalt mit der Funktion size(Feld). Eine
Auflistung aller im Moment benutzten Objekte liefert who und
whos gibt zusätzlich noch Angaben zur Größe dieser
Objekte aus:
Leere Felder sind solche, bei denen eine Dimension die Läge 0 hat.
Ein solches Feld hat keine Elemente, ist aber trotzdem in einigen Situationen
sinnvoll nutzbar. Matlab unterscheidet auch leere Felder nach ihrer Gestalt.
1. Felder und Feldelemente
Ein Feld ist eine Datenstruktur, deren Elemente alle
von derselben skalaren Datenart sind.
Die Elemente sind ein- oder mehrdimensional angeordnet. Die Dimension
dieser Anordnung nennen wir die Dimension des Feldes.
Die Anordnung in jeder Dimension wird durch einen entsprechenden Index
beschrieben, Feldindices sind immer ganze Zahlen. In Matlab läufen
sie darüberhinaus immer in Einerschritten von 1 bis zu einer für
die betreffende Dimension charakteristischen Obergrenze, die wir als
Länge dieser Dimension bezeichnen.
Die Länge aller Dimensionen eines Feldes gibt die Gestalt
eines Feldes an. Ein n*m*p oder [n m p]-Feld ist dementsprechend ein
dreidimensionales Feld, dessen 1. Dimension die Länge n, dessen
2. Dimension die Länge m und dessen 3. Dimension die Länge p
hat. Die Indexwerte dieses Feldes laufen also von [1,1,1] bis [n,m,p].
Der Wert des Produktes n*m*p gibt gleichzeitig die Anzahl der Feldelemente
an. Man beachte, daß zwei Felder nur dann gleich sind, wenn sie
dieselbe Gestalt und die einander entsprechenden Elemente dieselben
Werte haben.
Felder treten insbesondere in der Mathematik und ihren Anwendungen auf,
ein Punkt im dreidimensionalen Raum wird durch drei Koordinaten beschrieben,
also ein eindimensionales Feld der Länge 3, eindimensionale Zahlenfelder
der Länge m bezeichnen wir auch als m-Vektoren. Im Falle eines
Koordinatenvektors spricht man meist von x-, y- und z-Koordinate anstelle
von 1., 2. und 3. Dimension.
Betrachtet man eine Menge von 10 Punkten im Raum und ordnet diese Punkte
nach irgend einem Kriterium, so daß es einen 1., 2., 3. Punkt gibt,
so haben wir ein zweidimensionales Feld der Gestalt 3*10 oder 10*3, je
nachdem, welchen Index wir als ersten wählen. Zweidimensionale n*m
Felder bezeichnen wir als n*m Matrizen. m*m Matrizen, also Matrizen mit
gleicher Länge in beiden Dimensionen heißen quadratisch. Quadratische
Matrizen sind von großer Bedeutung in der Mathematik.
Wenn in 5 Städten an 8 Tagen jeweils 6 numerische Meßwerte
erhoben werden und die Städte, die Tage und die Meßwerte
jeweils mit 1 beginnend durchnumeriert werden, erhalten wir, wenn wir die
Städte als 1., die Tage als 2. und die Meßwerte als 3.
Dimension wählen ein 3-dimensionales Zahlenfeld der Gestalt [5 8 6].
Diese Sammlung von Meßwerten ergibt aber kein Feld, wenn z.B:
Beispiel 1.1:
» A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Der Funktionsaufruf magic(4) liefert eine (quadratische) 4*4
Matrix. Bei der Ausgabe ordnet Matlab eine Matrix in Zeilen und
Spalten an. Elemente in derselben Spalte haben denselben 1. Indexwert,
Elemente in derselben Zeile denselben 2. Indexwert.
Der Funktionsaufruf magic(n) liefert eine n*n Matrix, bei der
die Summe über jede Zeile, die Summe über jede Spalte
und die Summe über jede Diagonale denselben Wert hat. Solche
Matrizen nennt man auch magische Quadrate.
Skalare sind in Matlab nur spezielle 1*1 Matrizen, was für den Anwender nicht sonderlich von
Bedeutung ist. Beachtung erfordert dagegen die Tatsache, daß Vektoren
nur als spezielle 1*n Matrizen (Zeilenmatrizen) oder n*1 Matrizen
(Spaltenmatrizen) auftreten. Matlab unterscheidet diese beiden Vektorenarten
durchgehend, was sicherlich gewöhnungsbedürftig ist.
Bei Funktionen, die zur Konstruktion von Feldern mit bestimmten
Elementwerte dienen, fehlt dementsprechend die Möglichkeit, einfache
eindimensionale Felder zu erzeugen, man muß sie als Spalten- oder
Zeilenvektoren erzeugen.
Beispiel 1.2:
Die Matlab-Funktion rand
liefert Felder, deren Elemente
gleichverteilte Zufallszahlen im Intervall (0,1) sind. Anders als
mit magic kann man mit rand Felder beliebiger Dimension
erzeugen.
» B=rand(5,1)
B =
0.9501
0.2311
0.6068
0.4860
0.8913
» B=rand(2,2,2)
B(:,:,1) =
0.2028 0.6038
0.1987 0.2722
B(:,:,2) =
0.1988 0.7468
0.0153 0.4451
» B=rand(5)
B =
0.9501 0.7621 0.6154 0.4057 0.0579
0.2311 0.4565 0.7919 0.9355 0.3529
0.6068 0.0185 0.9218 0.9169 0.8132
0.4860 0.8214 0.7382 0.4103 0.0099
0.8913 0.4447 0.1763 0.8936 0.1389
» C=rand(1,5)
C =
0.6449 0.8180 0.6602 0.3420 0.2897
» eye(3,3)
ans =
1 0 0
0 1 0
0 0 1
» eye(3)
ans =
1 0 0
0 1 0
0 0 1
» eye(4,2)
ans =
1 0
0 1
0 0
0 0
linspace(-2,+3,50)
liefert einen Vektor mit 50 zwischen -2 und +3 äquidistant
verteilten Werten.
logspace(-2,+2,2000)
liefert einen Vektor mit 2000 Werten, die auf einer logarithmisch
skalierten Strecke zwischen 1.0e-2 und 1.0e+2 äquidistant
verteilt sind.
» A=randn(2,3,4,5);
» nA=ndims(A)
nA =
4
» n2A=ndims(nA)
n2A =
2
» n3A=ndims(n2A)
n3A =
2
» S1A=size(A)
S1A =
2 3 4 5
» )S2A=size(S1A)
S2A =
1 4
» S3A=size(S2A)
S3A =
1 2
» S4A=size(S3A)
S4A =
1 2
» size(nA)
ans =
1 1
» who
Your variables are:
A S2A S4A n3A
S1A S3A n2A nA
» whos
Name Size Bytes Class
A 4-D 960 double array
S1A 1x4 32 double array
S2A 1x2 16 double array
S3A 1x2 16 double array
S4A 1x2 16 double array
n2A 1x1 8 double array
n3A 1x1 8 double array
nA 1x1 8 double array
Grand total is 133 elements using 1064 bytes
Man sieht insbesondere, daß einzelne Werte als 2-dimensionale Felder
der Gestalt 1*1 behandelt werden.
» A=zeros(0)
A =
[]
» size(A)
ans =
0 0
» ndims(A)
ans =
2
» B=ones(0,8)
B =
Empty matrix: 0-by-8
» size(B)
ans =
0 8
» ndims(B)
ans =
2
» C=rand(8,0,1,8)
C =
Empty array: 8-by-0-by-1-by-8
» size(C)
ans =
8 0 1 8
» ndims(C)
ans =
4
Dimensionen der Länge 1 tragen zu keinen Elemnten des Feldes bei,
werden aber auch bei der Dimensionszahl und der Gestalt berücksichtigt.
Mit dem Funktionsaufruf neuesFeld = squeeze(altesFeld)
kann man ein neues Feld erzeugen, bei dem die Dimensionen der Länge 1
eliminiert sind. squeeze eliminiert keine Dimensionen der Länge 0.
» A=rand(2,1,3);
» size(A)
ans =
2 1 3
» B=squeeze(A)
B =
0.9501 0.6068 0.8913
0.2311 0.4860 0.7621
» size(B)
ans =
2 3
» C=ones(4,0,5,6);
» size(C)
ans =
4 0 5 6
» D=squeeze(C)
D =
Empty array: 4-by-0-by-5-by-6
» size(D)
ans =
4 0 5 6