Logo der Universitaäit Hamburg, nur Graphik Logo des RRZ, nur Graphik
  UHHReg. Rechenzentrum   Suche  

Matlab Datenstrukturen

Datenstrukturen sind Daten, die aus einzelnen Elementen zusammengesetzt sind und eine bestimmte Struktur aufweisen. Aus dem Alltagsleben kennen Sie sicher Listen, Tabellen und ähnliche Strukturen.

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.

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:
  • einige der Meßwerte Zahlen, die anderen keine Zahlen ('Regen', 'Sonnenschein') sind. Bei einem Feld müssen gleichartige Elemente vorliegen.
  • einige der Meßwerte fehlen, für Stadt 1 und Tag 3 etwa nur 5 statt 6 M&eszlig;werte vorliegen. Bei einem Feld ist die Länge einer Dimension immer unabhängig vom Wert der Indices in den anderen Dimensionen.

Beispiel 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.

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.
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 6.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.
  • rand(1,n) liefert einen Zeilenvektor der Länge n
  • rand(n,1) liefert eine Spaltenvektor der Länge n
  • rand(n) liefert eine quadratische n*n Matrix
  • rand(n,m) liefert eine n*m Matrix
  • rand(n,m,p) liefert ein n*m*p Feld
» 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

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.

  • eye liefert nur Matrizen, keine höher-dimensionalen Felder. Alle Elementwerte außerhalb der Diagonalen sind 0, alle Werte auf den Diagonalen sind 1.
    » 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
    
  • ones liefert Felder beliebiger Gestalt, bei denen alle Elemente den Wert 1 haben.
    » ones(2,3,2)
    ans(:,:,1) =
         1     1     1
         1     1     1
    ans(:,:,2) =
         1     1     1
         1     1     1
    
  • zeros liefert Felder beliebiger Gestalt, bei denen alle Elemente den Wert 0 haben.
    » zeros(3,2,2)
    ans(:,:,1) =
         0     0
         0     0
         0     0
    ans(:,:,2) =
         0     0
         0     0
         0     0
    
  • randn liefert Felder beliebiger Gestalt, bei denen die Elementwerte normalverteilt mit Mittelwert 0 und Standardabweichung 1 sind.
    » randn(2,2,2,2)
    ans(:,:,1,1) =
       -0.4326    0.1253
       -1.6656    0.2877
    ans(:,:,2,1) =
       -1.1465    1.1892
        1.1909   -0.0376
    ans(:,:,1,2) =
        0.3273   -0.1867
        0.1746    0.7258
    ans(:,:,2,2) =
       -0.5883   -0.1364
        2.1832    0.1139
    
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:

» 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.

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.

» 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 keinem Element des Feldes bei, werden aber 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


Weiter mit: