Vorlesung 3: Matrizen

Eine Matrix ist in Matlab ein zweidimensionales Feld aus reellen oder komplexen Zahlen.

Contents

clear all
format short e

Konstruktion von Matrizen

Eine kleine Matrix koennen wir definieren, indem wir die Matrixelemente in eckicken Klammern angeben. Matrixelemente innerhalb einer Zeile werden mit Leerzeichen oder Komma getrennt. Zeilen trennt man durch Semikolon oder durch das Einfuegen einer Leerzeile.

Beispiele:

A = [1 2 3;
    4 5 6;
    7 8 9]
A =

     1     2     3
     4     5     6
     7     8     9

A = [1,2,3;
    4,5,6;
    7,8,9]
A =

     1     2     3
     4     5     6
     7     8     9

A = [1 2 3

4 5 6

7 8 9]
A =

     1     2     3
     4     5     6
     7     8     9

Matrizen koennen (wie wir es bereits bei eindimensionalen Feldern gesehen haben) aus passenden Arrays zusammengesetzt werden.

b = [10;11;12];
C = [A b]
C =

     1     2     3    10
     4     5     6    11
     7     8     9    12

Weitere Beispiele:

C = [A 2*A]
C =

     1     2     3     2     4     6
     4     5     6     8    10    12
     7     8     9    14    16    18

C = [A; 2*A]
C =

     1     2     3
     4     5     6
     7     8     9
     2     4     6
     8    10    12
    14    16    18

C = [[1,2;3,5] [5;6]]
C =

     1     2     5
     3     5     6

Konstruktion von Matrizen: ones und zeros

Wir kennen bereits die Matlab-Befehle zeros und ones, deren Verwendung wir noch einmal wiederholen.

A = zeros(4,3)
A =

     0     0     0
     0     0     0
     0     0     0
     0     0     0

B = ones(4,3)
B =

     1     1     1
     1     1     1
     1     1     1
     1     1     1

C = [A B]
C =

     0     0     0     1     1     1
     0     0     0     1     1     1
     0     0     0     1     1     1
     0     0     0     1     1     1

Fuer die Erzeugung einer 3x3 Matrix mit Eintraegen 7 gibt es wieder mehrere Moeglichkeiten:

Beachte die verkuerzte Notation fuer quadratische Matrizen.

A = 7*ones(3)
A =

     7     7     7
     7     7     7
     7     7     7

A = 7*ones(3,3)
A =

     7     7     7
     7     7     7
     7     7     7

A = 7+zeros(3)
A =

     7     7     7
     7     7     7
     7     7     7

Konstruktion von Matrizen: eye und diag

Weitere oft verwendete Matlab-Befehle zur Erzeugung von Matrizen sind

eye: eye(N) liefert NxN Einheitsmatrix

diag: Erzeugt eine Diagonalmatrix

N = 4;
eye(N)
ans =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1

Informationen zur Nutzung von diag:

help diag
 DIAG Diagonal matrices and diagonals of a matrix.
    DIAG(V,K) when V is a vector with N components is a square matrix
    of order N+ABS(K) with the elements of V on the K-th diagonal. K = 0
    is the main diagonal, K > 0 is above the main diagonal and K < 0
    is below the main diagonal. 
 
    DIAG(V) is the same as DIAG(V,0) and puts V on the main diagonal.
 
    DIAG(X,K) when X is a matrix is a column vector formed from
    the elements of the K-th diagonal of X.
 
    DIAG(X) is the main diagonal of X. DIAG(DIAG(X)) is a diagonal matrix.
 
    Example
       m = 5;
       diag(-m:m) + diag(ones(2*m,1),1) + diag(ones(2*m,1),-1)
    produces a tridiagonal matrix of order 2*m+1.
 
    See also SPDIAGS, TRIU, TRIL, BLKDIAG.

    Overloaded methods:
       sym/diag

    Reference page in Help browser
       doc diag

Beispiele zur Verwendung von diag:

D = diag([1,2,3])
D =

     1     0     0
     0     2     0
     0     0     3

ND = diag([1,2,3],1)
ND =

     0     1     0     0
     0     0     2     0
     0     0     0     3
     0     0     0     0

ND = diag([1,2,3],-1)
ND =

     0     0     0     0
     1     0     0     0
     0     2     0     0
     0     0     3     0

Wendet man diag auf eine Matrix an, so erhaelt man die Diagonale.

A = [1,2,3;
    4,5,6;
    7,8,9];
D = diag(A)
D =

     1
     5
     9

Matrix Informationen: size, length, ndims, find

size: Anzahl der Zeilen und Spalten

length: Liefert die groessere Dimension

ndims: Anzahl der Dimensionen

find: Index der Matrixelemente ungleich Null

size(A)
ans =

     3     3

length(A)
ans =

     3

ndims(A)
ans =

     2

find(A)
ans =

     1
     2
     3
     4
     5
     6
     7
     8
     9

B = [0 1 0;
    2 0 3;
    0 4 0]
B =

     0     1     0
     2     0     3
     0     4     0

find(B)
ans =

     2
     4
     6
     8

Die Matlab-Befehle: tril, triu

tril: untere Dreiecksmatrix

triu: obere Dreiecksmatrix

clear all;
format short e;
A = [1,2,3;4,5,6;7,8,9]
A =

     1     2     3
     4     5     6
     7     8     9

tril(A)
ans =

     1     0     0
     4     5     0
     7     8     9

triu(A)
ans =

     1     2     3
     0     5     6
     0     0     9

diag(A)
ans =

     1
     5
     9

Konstruktion von Matrizen: reshape

help reshape
 RESHAPE Reshape array.
    RESHAPE(X,M,N) or RESHAPE(X,[M,N]) returns the M-by-N matrix 
    whose elements are taken columnwise from X. An error results 
    if X does not have M*N elements.
 
    RESHAPE(X,M,N,P,...) or RESHAPE(X,[M,N,P,...]) returns an 
    N-D array with the same elements as X but reshaped to have 
    the size M-by-N-by-P-by-.... The product of the specified
    dimensions, M*N*P*..., must be the same as NUMEL(X).
 
    RESHAPE(X,...,[],...) calculates the length of the dimension
    represented by [], such that the product of the dimensions 
    equals NUMEL(X). The value of NUMEL(X) must be evenly divisible 
    by the product of the specified dimensions. You can use only one 
    occurrence of [].
 
    See also SQUEEZE, SHIFTDIM, COLON.

    Overloaded methods:
       categorical/reshape
       sym/reshape

    Reference page in Help browser
       doc reshape

A = reshape(1:25,5,5)
A =

     1     6    11    16    21
     2     7    12    17    22
     3     8    13    18    23
     4     9    14    19    24
     5    10    15    20    25

A = reshape(1:12,2,6)
A =

     1     3     5     7     9    11
     2     4     6     8    10    12

A = reshape(1:12,6,2)
A =

     1     7
     2     8
     3     9
     4    10
     5    11
     6    12

Zugriff auf Matrixelemente

A = [1,2,3;
    4,5,6;
    7,8,9]
A =

     1     2     3
     4     5     6
     7     8     9

Zuriff auf ein einzelnes Matrixelement, durch Angabe der Zeilen- und Spaltennummer.

A(2,3) % einzelnes ELement
ans =

     6

A(1:2,2:3) % Untermatrix
ans =

     2     3
     5     6

A(1,:) % die gesamte erste Zeile
ans =

     1     2     3

A(1,2:end) % erste Zeile mit Ausnahme des Elements der ersten Spalte
ans =

     2     3

A(:,2)  % die gesamte 2. Spalte
ans =

     2
     5
     8

A(1:end-1,end) % letzte Spalte mit Ausname des letzten Elementes
ans =

     3
     6

Die Eintraege einer Matrix sind spaltenweise abgespeichert. Man kann daher auch unter Verwendung eines einzigen Index auf Matrixelemente zugreifen.

Wir betrachten dazu die folgenden Beispiele:

A(4)
ans =

     2

A([1 2 3 4])
ans =

     1     4     7     2

A(:)
ans =

     1
     4
     7
     2
     5
     8
     3
     6
     9

Elementare Matrixoperationen

Beispiele fuer die Verwendung von +, -, *, ^

clear all
A = ones(4,3);
B = 2*ones(4,3);
C = A+B
C =

     3     3     3
     3     3     3
     3     3     3
     3     3     3

C = A-B
C =

    -1    -1    -1
    -1    -1    -1
    -1    -1    -1
    -1    -1    -1

Die folgende Anweisung erzeugt (erwartungsgemaess) eine Fehlermeldung.

C = A*B

Das folgende Beispiel zeigt Matrixmultiplikation bei passender Dimension:

A = ones(4,3)
A =

     1     1     1
     1     1     1
     1     1     1
     1     1     1

B = 2*ones(3,4)
B =

     2     2     2     2
     2     2     2     2
     2     2     2     2

C = A*B
C =

     6     6     6     6
     6     6     6     6
     6     6     6     6
     6     6     6     6

A = reshape(1:9,3,3)
A =

     1     4     7
     2     5     8
     3     6     9

Potenzieren:

Asq = A^2
Asq =

    30    66   102
    36    81   126
    42    96   150

Matrix-Vektor-Multiplikation:

A = reshape(1:9,3,3);
b = [0;1;0];
A*b
ans =

     4
     5
     6

Berechnung der transponierten Matrix: (Apostroph)

A = reshape(1:9,3,3)
A =

     1     4     7
     2     5     8
     3     6     9

AT = A'
AT =

     1     2     3
     4     5     6
     7     8     9

Elementweise Operationen: .*, ./, .^

Beispiel zur elementweise Multiplikation:

A = [1,2,3;4,5,6;7,8,9];
B = [1,3,-1;2,4,0;6,0,1];
A.*B % elementweise Multiplikation
ans =

     1     6    -3
     8    20     0
    42     0     9

A*B  % Matrixmultiplikation
ans =

    23    11     2
    50    32     2
    77    53     2

A./A
ans =

     1     1     1
     1     1     1
     1     1     1

1./A
ans =

   1.0000e+00   5.0000e-01   3.3333e-01
   2.5000e-01   2.0000e-01   1.6667e-01
   1.4286e-01   1.2500e-01   1.1111e-01

Verwendung von ' und .'

Beachte: auch ' kann sowohl im Sinne der linearen Algebra, als auch elementweise verwendet werden.

Betrachte dazu das folgende Beispiel einer Matrix mit komplexwertigen Elementen.

A = [1-i, 2+i;3+i,4+i]
A =

   1.0000e+00 - 1.0000e+00i   2.0000e+00 + 1.0000e+00i
   3.0000e+00 + 1.0000e+00i   4.0000e+00 + 1.0000e+00i

A'  % hermitisch transponierte Matrix
ans =

   1.0000e+00 + 1.0000e+00i   3.0000e+00 - 1.0000e+00i
   2.0000e+00 - 1.0000e+00i   4.0000e+00 - 1.0000e+00i

A.' % elementweise transponierte Matrix
ans =

   1.0000e+00 - 1.0000e+00i   3.0000e+00 + 1.0000e+00i
   2.0000e+00 + 1.0000e+00i   4.0000e+00 + 1.0000e+00i

Elementweise Anwendung elementarer Funktionen

clear all
format short
A = [0,pi/4,pi/2;3*pi/4,pi,5*pi/4;3*pi/2,7*pi/4,2*pi]
A =

         0    0.7854    1.5708
    2.3562    3.1416    3.9270
    4.7124    5.4978    6.2832

sin(A)
ans =

         0    0.7071    1.0000
    0.7071    0.0000   -0.7071
   -1.0000   -0.7071   -0.0000

cos(A)
ans =

    1.0000    0.7071    0.0000
   -0.7071   -1.0000   -0.7071
   -0.0000    0.7071    1.0000

sin(A).^2 + cos(A).^2
ans =

     1     1     1
     1     1     1
     1     1     1

x = A';
y = sin(A)';
plot(x(:),y(:),'+')

Duennbesetzte Matrizen (Sparse matrices)

In vielen Anwendungen tauchen Matrizen auf, die sehr gross und sehr duenn besetzt sind. D.h. viele Matrixeintraege sind gleich Null. In derartigen Situationen macht es keinen Sinn alle Eintraege zu speichern

Wir hatten oben bereits unter Verwendung von diag Matrizen erzeugt.

D = diag([1,2,3],1)
D =

     0     1     0     0
     0     0     2     0
     0     0     0     3
     0     0     0     0

In diesem Beispiel ist D eine 4x4 Matrix

size(D)
ans =

     4     4

[DS,d] = spdiags(D)
DS =

     0
     1
     2
     3


d =

     1

DS hat die Groesse 4x1.

size(DS)
ans =

     4     1

Ein weiteres Beispiel:

M = ones(6,1)*[-10 5 15]
M =

   -10     5    15
   -10     5    15
   -10     5    15
   -10     5    15
   -10     5    15
   -10     5    15

S = spdiags(M,[-2 0 1],6,6)
S =

   (1,1)        5
   (3,1)      -10
   (1,2)       15
   (2,2)        5
   (4,2)      -10
   (2,3)       15
   (3,3)        5
   (5,3)      -10
   (3,4)       15
   (4,4)        5
   (6,4)      -10
   (4,5)       15
   (5,5)        5
   (5,6)       15
   (6,6)        5

Mit sparse und full koennen wir zwischen den Darstellungen wechseln.

A = full(S)
A =

     5    15     0     0     0     0
     0     5    15     0     0     0
   -10     0     5    15     0     0
     0   -10     0     5    15     0
     0     0   -10     0     5    15
     0     0     0   -10     0     5

S = sparse(A)
S =

   (1,1)        5
   (3,1)      -10
   (1,2)       15
   (2,2)        5
   (4,2)      -10
   (2,3)       15
   (3,3)        5
   (5,3)      -10
   (3,4)       15
   (4,4)        5
   (6,4)      -10
   (4,5)       15
   (5,5)        5
   (5,6)       15
   (6,6)        5

Unter Verwendung von spy koennen wir die Positionen der Matrixeintraege ungleich Null anzeigen.

spy(S)