<- matrix(data=c(1, 2, 3, 4),
A nrow=2,
ncol=2)
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
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).
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.
<- matrix(data=c(1, 2, 3, 4),
A 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
<- matrix(1:6, 2, 3)
A 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
<- matrix(1:9, 3, 3)
A A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
und
<- matrix(c(1, 2, 4, 4, 5, 6, 8, 8, 9),3,3)
B B
[,1] [,2] [,3]
[1,] 1 4 8
[2,] 2 5 8
[3,] 4 6 9
Der Gleichheitsoperator ergibt eine
== B A
[,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.
3,2] A[
[1] 6
Eine komplette Zeile wird ausgelesen, indem der Spaltenindex weggelassen wird. Die zweite Zeile von A
ist also
2,] A[
[1] 2 5 8
Für die Spaltenauszahl lässt man den Zeilenindex weg.
3] A[,
[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.
3,drop=FALSE] A[,
[,1]
[1,] 7
[2,] 8
[3,] 9
oder (achten Sie auf das doppelte Komma)
2,,drop=FALSE] A[
[,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 (
Die Transponierte sieht so aus:
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
<- matrix(1:6, 2, 3)
A 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,
all(A == t(t(A)))
[1] TRUE
Wenn eine Matrix gleich ihrer Transponierten ist, d.h. wenn
Beispiel:
Die Matrix
<- matrix(c(1,7,8,7,2,-3,8,-3,3),3,3)
A 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
Wie wir in Kapitel 2 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:
<- c(3,7,2)
a <- matrix(a, ncol=1)
x 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
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
<- matrix(1:4, 2, 2)
A A
[,1] [,2]
[1,] 1 3
[2,] 2 4
die Matrix
<- matrix(c(5, 7, 3, -2), 2, 2)
B B
[,1] [,2]
[1,] 5 3
[2,] 7 -2
so erhält man
+B A
[,1] [,2]
[1,] 6 6
[2,] 9 2
Der Versuch, zwei Matrizen mit unterschiedlichen Dimensionen zu addieren, führt zu einer Fehlermeldung:
<- matrix(1:4, 2, 2)
A <- matrix(1:6, 3, 2)
B +B
A
# 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).
<- matrix(1:4, 2, 2)
A +3 A
[,1] [,2]
[1,] 4 6
[2,] 5 7
-5 A
[,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.
<- matrix(1:4, 2, 2)
A + c(1,5) A
[,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
4.5 Matrizen-Skalarmultiplikation
In Abschnitt 2.6 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
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
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.
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 A
und die zweite B
).
<- matrix(c(1, 2, 4, 3, 1, 5), 3, 2)
A <- matrix(c(2, -2, 1, 1, -2, 3, -1, -5), 2, 4)
B %*% B A
[,1] [,2] [,3] [,4]
[1,] -4 4 7 -16
[2,] 2 3 -1 -7
[3,] -2 9 7 -29
Wenn an eine A
und den Vektor x
.
<- matrix(c(2, 1, 1, 0, -0.5, 1, -1, 2, -2), 3, 3)
A <- c(2, -2, 1)
x %*% x A
[,1]
[1,] 3
[2,] 5
[3,] -2
Multipliziert man einen Zeilenvektor an eine Matrix, so ergibt sich wieder ein Zeilenvektor:
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
.
<- c(2, -3)
y <- matrix(c(2, -2, 1, 0, 3, 0.5), 2, 3)
B %*% B y
[,1] [,2] [,3]
[1,] 10 2 4.5
Bei der Multiplikation von Zeilen- und Spaltenvektoren sind zwei Situationen relevant. Multipliziert man einen Zeilenvektor
Als Beispiel sehen wir uns das Produkt aus
<- matrix(c(1, 2, 3), 1, 3)
x <- matrix(c(5, -1, 2), 3, 1)
y %*% y x
[,1]
[1,] 9
Multipliziert man hingegen einen
%*% x y
[,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
<- matrix(c(1, 2, 3, 4), 2, 2)
A <- matrix(c(-1, 1, 1, 2), 2, 2)
B %*% B A
[,1] [,2]
[1,] 2 7
[2,] 2 10
aber
%*% A B
[,1] [,2]
[1,] 1 1
[2,] 5 11
Die Matrixmultiplikation ist assoziativ, d.h.
Ferner gilt das Distributivgesetz (wenn die Dimensionen alle passend sind),
Als Beispiel nehmen wir die beiden
<- matrix(c(-3, 1, 0.5, 1, 5, 0), 2, 3)
C +B) %*% C (A
[,1] [,2] [,3]
[1,] 4 4.0 0
[2,] -3 7.5 15
und für
%*% C + B %*% C A
[,1] [,2] [,3]
[1,] 4 4.0 0
[2,] -3 7.5 15
Für die Transponierte des Produkts gilt
4.7 Spur
Als Spur (engl. trace) einer quadratischen Matrix bezeichnet man die Summe ihrer Diagonalelemente,
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)
<- matrix(1:9,3,3)
A 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