4  Matrizen (I)

4.1 Definition

Unter einer Matrix (pl. Matrizen, engl. matrix, pl. matrices) versteht man allgemein eine Anordnung von Zahlen in einer rechteckigen Form. Die Matrix A=[a11a12a1na21a22a2nam1am2amn] hat m Zeilen (engl. rows) und n Spalten (engl. columns). Man sagt auch, dass es sich um eine Matrix der Dimension m×n (“m Kreuz n”) handelt, oder einfacher: A ist eine (m×n)-Matrix. Die Matrix enthält mn Elemente, jedes Element wird durch zwei Subindizes bezeichnet. Der erste Subindex steht dabei immer für die Zeile, der zweite für die Spalte (“zuerst die Zeile, später die Spalte”). Wenn es zu Verwechselungen kommen kann, trennt man Zeilen- und Spaltenindex durch ein Komma. Es ist gängige Praxis, Matrizen mit fett gedruckten Großbuchstaben und ihre Elemente mit den entsprechenden normal gedruckten Kleinbuchstaben zu bezeichnen. Matrizen, bei denen die Zahl der Zeilen und die Zahl der Spalten gleich ist, nennt man quadratisch.

In R wird eine Matrix durch die Funktion matrix generiert. Die Funktion hat meist drei Argumente. Das erste Argument data enthält die Werte, die in der Matrix stehen, das zweite Argument nrow ist die Zahl der Zeilen, das dritte Argument ncol die Zahl der Spalten (die Namen der Argumente werden zur Vereinfachung oft weggelassen).

A <- matrix(data=c(1, 2, 3, 4), 
            nrow=2, 
            ncol=2)

Die Matrix wird standardmäßig spaltenweise aufgefüllt. In diesem Beispiel erhält man also die Matrix

A
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Diese Anordnung ist manchmal unpraktisch. Um die Daten zeilenweise aufzufüllen, gibt es in der Funktion matrix die Option byrow. Setzt man diese Option auf TRUE, dann werden die Daten zeilenweise in die Matrix eingefügt.

A <- matrix(data=c(1, 2, 3, 4), 
            nrow=2, 
            ncol=2,
            byrow=TRUE)
A
     [,1] [,2]
[1,]    1    2
[2,]    3    4

Wenn die Länge des Datenvektors data kleiner ist als die Zahl der Matrixelemente, wird der Vektor recycelt. Zum Beispiel gilt

matrix(data=c(1, 2), nrow=2, ncol=2)
     [,1] [,2]
[1,]    1    1
[2,]    2    2

und

matrix(data=c(1, 2), nrow=2, ncol=2, byrow=TRUE)
     [,1] [,2]
[1,]    1    2
[2,]    1    2

Wenn das Produkt aus Zeilen- und Spaltenzahl kein ganzzahliges Vielfaches der Anzahl der Elemente in data ist, gibt R eine Warnung aus.

matrix(data=c(1, 2, 3), ncol=2, nrow=2)

#> Warnung: Datenlänge [3] ist kein Teiler oder Vielfaches der Anzahl der Zeilen [2]
#> [1,]    1    3
#> [2,]    2    1

Wenn nur ein einziger Wert angegeben ist, wird er in alle Zellen eingesetzt (und R verzichtet auf eine Warnung). Zum Beispiel:

matrix(5, ncol=3, nrow=3)
     [,1] [,2] [,3]
[1,]    5    5    5
[2,]    5    5    5
[3,]    5    5    5

Die Dimensionen einer Matrix liefert die Funktion dim. Der Return der Funktion dim ist ein Vektor der Länge 2, das erste Elemente ist die Zeilenzahl, das zweite Element ist die Spaltenzahl. Als Beispiel betrachten wir die Matrix

A <- matrix(1:6, 2, 3)
A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Die Dimensionen von A sind

dim(A)
[1] 2 3

Wenn wir uns nur für die Zeilenzahl interessieren, können wir sie so finden:

dim(A)[1]
[1] 2

Matrizen können mit logischen Operatoren miteinander verglichen werden. Die Operatoren werden elementweise auf die Matrizen angewendet, die Dimensionen der Matrizen müssen daher gleich sein. Der wichtigste logische Operator ist ==, mit ihm wird Gleichheit überprüft (beachten Sie das doppelte Gleichheitszeichen, das einfache Gleichheitszeichen ist in R auch erlaubt, es ist jedoch ein Synonym für den Zuweisungsoperator <-).

Beispiel:

Wir betrachten die beiden (3×3)-Matrizen

A <- matrix(1:9, 3, 3)
A
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

und

B <- matrix(c(1, 2, 4, 4, 5, 6, 8, 8, 9),3,3)
B
     [,1] [,2] [,3]
[1,]    1    4    8
[2,]    2    5    8
[3,]    4    6    9

Der Gleichheitsoperator ergibt eine (3×3)-Matrix von logischen Werten,

A == B
      [,1] [,2]  [,3]
[1,]  TRUE TRUE FALSE
[2,]  TRUE TRUE  TRUE
[3,] FALSE TRUE  TRUE

In diesem Fall sieht man sofort, dass die Matrizen nicht gleich sind, da es FALSE-Einträge gibt. Bei sehr großen Matrizen mit vielen Tausend Elementen ist es aber nicht sinnvoll, alle Einträge einzeln zu untersuchen. Hier bietet sich die Funktion all an.

all(A==B)
[1] FALSE

Man erkennt unmittelbar, dass nicht alle Elemente der beiden Matrizen gleich sind.

Matrizen werden in R ähnlich wie Vektoren durch eckige Klammern indiziert. Der einfachste Fall ist das Herauslesen eines einzelnen Elements aus einer Matrix.

A[3,2]
[1] 6

Eine komplette Zeile wird ausgelesen, indem der Spaltenindex weggelassen wird. Die zweite Zeile von A ist also

A[2,]
[1] 2 5 8

Für die Spaltenauszahl lässt man den Zeilenindex weg.

A[,3]
[1] 7 8 9

Beim Auslesen einer Zeile oder Spalte erhält man einen Vektor, keine Matrix. Das ist in manchen Fällen unpraktisch. Darum kann man den Datentyp “matrix” erzwingen, indem man als Option drop=FALSE in die eckigen Klammern schreibt.

A[,3,drop=FALSE]
     [,1]
[1,]    7
[2,]    8
[3,]    9

oder (achten Sie auf das doppelte Komma)

A[2,,drop=FALSE]
     [,1] [,2] [,3]
[1,]    2    5    8

Dann erhält man beim Auslesen einer Spalte einen Spaltenvektor und beim Auslesen eines Zeilenvektors einen Zeilenvektor.

Die logische Indizierung von Matrizen ist ebenfalls analog zu den Vektoren möglich, wird aber relativ selten benötigt.

4.2 Transponierte Matrix

Wenn man die Zeilen und Spalten miteinander vertauscht, ergibt sich die transponierte Matrix bzw. die Transponierte (engl. transpose). Es gibt zwei gängige Arten der Notation für die Transponierte. Zum einen durch einen angehängten Hochstrich (A), zum anderen durch ein hochgestelltes T (A oder AT). Es gibt mehrere Möglichkeiten, diese Ausdrücke auszusprechen. Gängig sind: “A Strich” oder “A transponiert” (engl. “A prime” oder “A transpose”). In diesem Kurs verwenden wir die Notation A.

Die Transponierte sieht so aus: A=[a11a21am1a12a22am2a1na2namn]. Es handelt sich also um eine (n×m)-Matrix.

In R erhält man die Transponierte einer Matrix mit Hilfe der Funktion t. Da der Buchstabe t in R eine Funktion ist, sollte man möglichst vermeiden, andere Objekte oder Variablen mit t zu benennen. Als Beispiel sehen wir uns die folgende (2×3)-Matrix an:

A <- matrix(1:6, 2, 3)
A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Die Transponierte von A ist

t(A)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

Die Dimensionen von t(A) sind:

dim(t(A))
[1] 3 2

Transponiert man eine transponierte Matrix noch einmal, so erhält man wieder die Ausgangsmatrix, (A)=A. Für die Beispielmatrix bestätigt R die Gleichheit:

all(A == t(t(A)))
[1] TRUE

Wenn eine Matrix gleich ihrer Transponierten ist, d.h. wenn A=A, dann nennt man sie symmetrisch. Offensichtlich müssen symmetrische Matrizen quadratisch sein. Die Elemente oberhalb der Diagonale sind identisch zu den Elementen unterhalb der Diagonale.

Beispiel:

Die Matrix

A <- matrix(c(1,7,8,7,2,-3,8,-3,3),3,3)
A
     [,1] [,2] [,3]
[1,]    1    7    8
[2,]    7    2   -3
[3,]    8   -3    3

ist symmetrisch, denn

t(A) == A
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

bzw.

all(t(A) == A)
[1] TRUE

4.3 Vektoren als Spezialfälle

Vektoren können als Matrizen mit nur einer Zeile oder nur einer Spalte geschrieben werden. Als Konvention hat sich weltweit durchgesetzt, dass Vektoren als Matrix mit einer Spalte aufgefasst werden, sofern nichts anderes angegeben ist. Man spricht auch von einem Spaltenvektor. Der zweite Subindex ist in diesem Fall überflüssig und wird daher meist einfach weggelassen. Der Vektor x=[x1x2xm] der Länge m kann also formal als eine (m×1)-Matrix aufgefasst werden. Folglich ist die Transponierte x=[x1x2xm] ein Zeilenvektor. Spaltenvektoren werden in ökonometrischen Texten sehr oft als (x1,,xn) notiert, also als transponierter Zeilenvektor. In diesem Kurs nutzen wir diese Notation ebenfalls oft.

Wie wir in gesehen haben, sind Vektoren in R keine Matrizen, sie haben keine Dimensionen (dim), sondern nur eine Länge (length). Es ist jedoch auch in R möglich, Vektoren als Matrizen mit nur einer Spalte (oder Zeile) zu schreiben.

Beispiel:

a <- c(3,7,2)
x <- matrix(a, ncol=1)
x
     [,1]
[1,]    3
[2,]    7
[3,]    2

Die Dimensionen von x sind

dim(x)
[1] 3 1

4.4 Addition von Matrizen

Zwei Matrizen A und B, die beide die gleiche Dimension (n×m) haben, können addiert werden. Die Summe der beiden Matrizen ist ebenfalls eine Matrix der Dimension (n×m). Ihre Elemente ergeben sich als die Summe der entsprechenden Elemente von A und B, A+B=[a11a1nam1amn]+[b11b1nbm1bmn]=[a11+b11a1n+b1nam1+bm1amn+bmn]. Zwei Matrizen A und B können in R addiert werden, indem man A+B eingibt. Dabei wird vorausgesetzt, dass die Dimensionen von A und B gleich sind.

Addiert man zu der Matrix

A <- matrix(1:4, 2, 2)
A
     [,1] [,2]
[1,]    1    3
[2,]    2    4

die Matrix

B <- matrix(c(5, 7, 3, -2), 2, 2)
B
     [,1] [,2]
[1,]    5    3
[2,]    7   -2

so erhält man

A+B
     [,1] [,2]
[1,]    6    6
[2,]    9    2

Der Versuch, zwei Matrizen mit unterschiedlichen Dimensionen zu addieren, führt zu einer Fehlermeldung:

A <- matrix(1:4, 2, 2)
B <- matrix(1:6, 3, 2)
A+B

# Fehler in A + B : nicht passende Arrays

Es gibt in R jedoch Matrix-Additionen, die in der Mathematik so nicht vorgesehen sind. Beispielsweise kann man einen Skalar zu einer Matrix addieren (oder subtrahieren). In diesem Fall wird jedes Element der Matrix mit der Skalar addiert (bzw. subtrahiert).

A <- matrix(1:4, 2, 2)
A+3
     [,1] [,2]
[1,]    4    6
[2,]    5    7
A-5
     [,1] [,2]
[1,]   -4   -2
[2,]   -3   -1

Es ist auch erlaubt (jedoch nicht empfehlenswert!), einen Vektor und eine Matrix zu addieren. Dabei werden die Vektorelemente nacheinander mit den Matrixelementen summiert, wobei die Matrixelemente spaltenweise durchlaufen werden.

A <- matrix(1:4, 2, 2)
A + c(1,5)
     [,1] [,2]
[1,]    2    4
[2,]    7    9

Da diese Art von Operationen jedoch in der Mathematik nicht vorgesehen sind, sollte man sie beim Programmieren in R möglichst vermeiden. Es wäre eine häufige Fehlerquelle.

Für die Transponierte der Summe gilt (A+B)=A+B. Die Matrixaddition ist kommutativ, d.h. A+B=B+A, und assoziativ, d.h. (A+B)+C=A+(B+C).

4.5 Matrizen-Skalarmultiplikation

In wurde definiert, wie man einen Vektor mit einem Skalar multipliziert. Auf die gleiche Weise kann man definieren, wie eine Matrix mit einem Skalar multipliziert wird:

Sei A eine Matrix der Dimension (m×n). Für einen Skalar λR gilt λA=[λa11λa12λa1nλa21λa22λa2nλam1λam2λamn]. Es wird also jedes Element der Matrix mit λ multipliziert. Für zwei geeignet dimensionierte Matrizen A und B sowie für λ,μR gilt: λ(A+B)=λA+λB und (λ+μ)A=λA+μA.

4.6 Matrixmultiplikation

Für die Matrixmultiplikation muss die Spaltenzahl der ersten (vorderen) Matrix der Zeilenzahl der zweiten (hinteren) Matrix entsprechen. Wir betrachten die Matrix A der Dimension (m×k) und die Matrix B der Dimension (k×n). Das Produkt AB ist die (m×n)-Matrix AB=[i=1ka1ibi1i=1ka1ibi2i=1ka1ibini=1ka2ibi1i=1ka2ibi2i=1ka2ibini=1kamibi1i=1kamibi2i=1kamibin]. Die Berechnung des Matrixprodukt kann man sich in Form des folgenden Schemas merken, in dem man die hintere Matrix nach oben schiebt: [b11b1nbk1bkn]  [a11a1kam1amk][i=1ka1ibi1i=1ka1ibini=1kamibi1i=1kamibin] Um in der Produktmatrix das Element in Zeile i und Spalte j zu berechnen, braucht man also die i-te Zeile von A und die j-te Spalte von B. Ihr inneres Produkt ist der gesuchte Wert.

Wenn Matrizen miteinander multipliziert werden, müssen die Dimensionen an den “Schnittstellen” zueinander passen. Zur Kontrolle ist es oftmals hilfreich, die Dimensionen unter die Matrizen zu schreiben. Am×k  Bk×n=Cm×n.

Die Matrixmultiplikation in R erfolgt mit dem Operator %*%, nicht mit dem normalen Multiplikationszeichen *.

Die folgenden Beispiele zeigen, wie Matrizen unterschiedlicher Dimensionen miteinander multipliziert werden.

Als erstes wird eine (3×2)-Matrix mit einer (2×4)-Matrix multipliziert. Man erhält eine (3×4)-Matrix: [132145][21212135]=[44716231729729]. In R erhält man dieses Ergebnis wie folgt (wir nennen die erste Matrix A und die zweite B).

A <- matrix(c(1, 2, 4, 3, 1, 5), 3, 2)
B <- matrix(c(2, -2, 1, 1, -2, 3, -1, -5), 2, 4)
A %*% B
     [,1] [,2] [,3] [,4]
[1,]   -4    4    7  -16
[2,]    2    3   -1   -7
[3,]   -2    9    7  -29

Wenn an eine (3×3)-Matrix ein Spaltenvektor der Länge 3 (also eine Matrix der Dimension (3×1)) multipliziert wird, erhält man wieder einen Spaltenvektor der Länge 3 (nämlich die lineare Transformation): [20110.52112][221]=[352]. In diesem Fall darf man in R auch einen Vektor, der nicht als Spaltenmatrix definiert wurde, an die Matrix heranmultiplizieren. Im folgenden Code nennen wir die Matrix A und den Vektor x.

A <- matrix(c(2, 1, 1, 0, -0.5, 1, -1, 2, -2), 3, 3)
x <- c(2, -2, 1)
A %*% x
     [,1]
[1,]    3
[2,]    5
[3,]   -2

Multipliziert man einen Zeilenvektor an eine Matrix, so ergibt sich wieder ein Zeilenvektor: [23][213200.5]=[1024.5].

Auch hier ist es in R möglich, einen Vektor an die Matrix heranzumultiplizieren. In dem Code heißt der Vektor y und die Matrix B.

y <- c(2, -3)
B <- matrix(c(2, -2, 1, 0, 3, 0.5), 2, 3)
y %*% B
     [,1] [,2] [,3]
[1,]   10    2  4.5

Bei der Multiplikation von Zeilen- und Spaltenvektoren sind zwei Situationen relevant. Multipliziert man einen Zeilenvektor x der Dimension (1×n) mit einem Spaltenvektor y der Dimension (n×1), so erhält man einen Skalar (bzw. eine Matrix der Dimension (1×1)).

Als Beispiel sehen wir uns das Produkt aus x=[123] und y=[512] an. Wir erhalten

x <- matrix(c(1, 2, 3), 1, 3)
y <- matrix(c(5, -1, 2), 3, 1)
x %*% y
     [,1]
[1,]    9

Multipliziert man hingegen einen (n×1)-Spaltenvektor mit einem (1×n)-Zeilenvektor, so ergibt sich eine (n×n)-Matrix. Zum Beispiel gilt

y %*% x
     [,1] [,2] [,3]
[1,]    5   10   15
[2,]   -1   -2   -3
[3,]    2    4    6

Was passiert, wenn man bei einer Matrixmultiplikation versehentlich anstelle von %*% das übliche Multiplikationszeichen * verwendet? Sofern die Matrizen unterschiedliche Dimensionen haben, wird es eine Fehlermeldung (oder in wenigen Fällen zumindest eine Warnung) geben. Wenn die beiden Matrizen jedoch die gleichen Dimensionen haben, berechnet R die elementweisen Produkte. Mit anderen Worten: A * B ist im Allgemeinen ungleich A %*% B!

Die Verwechslung dieser beiden Operatoren %*% und * ist ein häufiger Fehler.

Die Matrixmultiplikation ist im Gegensatz zu der normalen Multiplikation reeller Zahlen nicht kommutativ. Selbst wenn die Dimensionen eine Multiplikation in beide Richtungen erlauben, so gilt im Allgemeinen ABBA. Das wird an folgendem Gegenbeispiel deutlich. Wir betrachten die beiden Matrizen A=[1324],B=[1112]. Dann gilt

A <- matrix(c(1, 2, 3, 4), 2, 2)
B <- matrix(c(-1, 1, 1, 2), 2, 2)
A %*% B
     [,1] [,2]
[1,]    2    7
[2,]    2   10

aber

B %*% A
     [,1] [,2]
[1,]    1    1
[2,]    5   11

Die Matrixmultiplikation ist assoziativ, d.h. (AB)C=A(BC), sofern die Dimensionen der Matrizen zueinander passen.

Ferner gilt das Distributivgesetz (wenn die Dimensionen alle passend sind), (A+B)C=AC+BC bzw. A(B+C)=AB+AC.

Als Beispiel nehmen wir die beiden (2×2)-Matrizen A und B und multiplizieren ihre Summe an die (2×3)-Matrix C=[30.55110]. In R erhält man für den Ausdruck (A+B)C

C <- matrix(c(-3, 1, 0.5, 1, 5, 0), 2, 3)
(A+B) %*% C
     [,1] [,2] [,3]
[1,]    4  4.0    0
[2,]   -3  7.5   15

und für AC+BC ergibt sich

A %*% C + B %*% C
     [,1] [,2] [,3]
[1,]    4  4.0    0
[2,]   -3  7.5   15

Für die Transponierte des Produkts gilt (AB)=BA, d.h. die Reihenfolge dreht sich um. Es ist instruktiv, hier die Dimensionen unter die Matrizen zu schreiben: (Am×k Bk×n)=Bn×k Ak×m. Gleichungen mit Matrizen und Vektoren können so ähnlich wie “normale” Gleichungen umgeformt werden, z.B. indem man auf beiden Seiten der Gleichung einen Term addiert oder mit einer Matrix multipliziert. Natürlich müssen die Dimensionen immer passend sein. Bei der Multiplikation mit einer Matrix muss darauf geachtet werden, dass die Matrixmultiplikation nicht kommutativ ist. Es macht also einen Unterschied, ob die Matrix von links oder von rechts an die beiden Seiten der Gleichung heranmultipliziert wird. Man spricht daher auch von Links- oder Rechtsmultiplizieren (engl. left or right multiplication).

4.7 Spur

Als Spur (engl. trace) einer quadratischen Matrix bezeichnet man die Summe ihrer Diagonalelemente, tr(A)=i=1naii. Für die Spur gelten folgende Zusammenhänge. tr(A+B)=tr(A)+tr(B)tr(λA)=λtr(A)tr(A)=tr(A). Eine sehr nützliche Regel gilt für das Matrixprodukt. Sei A eine (n×k)-Matrix und B eine (k×n)-Matrix, dann gilt tr(AB)=tr(BA). Die Matrizen AB und BA sind beide quadratisch, aber sie haben unterschiedliche Dimensionen. Die Matrix AB ist eine (n×n)-Matrix, dagegen ist BA eine (k×k)-Matrix. Diese beiden Matrizen haben die gleiche Spur.

In R gibt es standardmäßig keine Funktion zur Berechnung der Spur. Das Paket pracma bietet jedoch die Funktion Trace, die die Summe aller Diagonalelemente für quadratische Matrizen ausgibt:

library(pracma)
A <- matrix(1:9,3,3)
A
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

Die Spur der Matrix beträgt

Trace(A)
[1] 15