---
fontsize: 11pt
format: pdf
bibliography: 1_Referenzen_S.bib
include-in-header: 1_Header_S.tex
---

# (1) Matrizen

Ziel dieses Seminar ist es, die Matrizenrechnung in **R** anhand der in der 
Vorlesung diskutierten Beispiele nachzuvollziehen und optional weitere 
Übungsaufgaben mithilfe von **R** zu lösen. 

## Matrizenrechnung in **R**

Wir betrachten zunächst die spaltenweise und zeilenweise Definition von Matrizen
in **R** anhand zweier in der Vorlesung gegebener  Beispiele zur Matrixaddition und
Matrixsubtraktion. Man beachte, dass die (non-default) zeilenweise Definition 
einer Matrix mithilfe von `byrow = TRUE` eine höhere Korrespondenz zwischen **R** 
Codebild und **R** Repräsentation ermöglicht.


\footnotesize
```{r, echo = T}
# Spaltenweise Definition von A (R default)
A = matrix(c(2,1,-3,6,0,5), nrow = 2)
print(A)
```
\normalsize

\footnotesize
```{r, echo T}
# Zeilenweise Definition von B
B = matrix(c(4,1,0,
            -4,2,0), nrow = 2, byrow = TRUE)
print(B)
```
\normalsize

Die Addition und Subtraktion von Matrizen werden in **R** dann mit den Operatoren
`+` und `-` implementiert. Entsprechend der analytischen Betrachtung in der 
Vorlesung ergeben sich

\footnotesize
```{r}
# Addition
C = A + B
print(C)
```
\normalsize

und

\footnotesize
```{r}
# Subtraktion
D = A - B
print(D)
```
\normalsize

Das in der Vorlesung betrachtete Beispiel zur Skalarmultiplikation ergibt sich
mit dem Skalarmultiplikationsoperator `*` wie folgt.

\footnotesize
```{r}
# Definitionen
A = matrix(c(3,1,1,
             5,2,5,
             2,7,1,
             3,4,2),
           nrow = 4,
           byrow = TRUE)
c = -3

# Skalarmultiplikation
B = c*A
print(B)
```
\normalsize

Das in der Vorlesung betrachtete Beispiel zur Matrixtransposition schließlich
ergibt sich mit dem Transpositionsoperator `t()` wie folgt.

\footnotesize
```{r}
# Definition
A = matrix(c(2,3,0,
             1,6,5),
           nrow = 2,
           byrow = TRUE)

# Transposition
AT = t(A)
print(A)
print(AT)
```
\normalsize

Das erste in der Vorlesung betrachtete Beispiel zur Matrixmultiplikation implementiert
man in **R** mithilfe des Matrixmultiplikationsoperators `%*%` wie folgt.

\footnotesize
```{r}
# Definitionen
A = matrix(c(2,-3,0,
             1, 6,5),
           nrow  = 2,
           byrow = TRUE)
B = matrix(c( 4,2,
             -1,0,
              1,3),
           nrow  = 3,
           byrow = TRUE)

# Matrixmultiplikation
C = A %*% B
print(C)
```
\normalsize

Das zweite Beispiel zur Matrixmultiplikation ergibt sich als

\footnotesize
```{r}
# Definitionen
A = matrix(c(2,-3,0,
             1, 6,5),
           nrow  = 2,
           byrow = TRUE)
B = matrix(c( 4,2,
             -1,0,
              1,3),
           nrow  = 3,
           byrow = TRUE)

# Matrixmultiplikation
D = B %*% A
print(D)
```
\normalsize

Sind in **R** definierte Matrizen nicht von für die Definition der Matrixmultiplikation
erforderlichen Größen, so ergibt sich ein Fehler.

\footnotesize
```{r, error = TRUE}
# Beispiel für eine undefinierte Matrixmultipliation
E = t(A) %*% B      # (3 x 2)(3 x 2)
```
\normalsize

Inverse Matrizen berechnet man in **R** für gewöhnlich mit dem Befehl `solve()`.
Für das in der Vorlesung betrachtete Beispiel einer invertierbaren $2 \times 2$
Matrix ergibt sich entsprechend folgender **R** Code.

\footnotesize
```{r}
# Definition
A = matrix(c(2,1,
             3,4),
           nrow  = 2,
           byrow = TRUE)

# Berechnen von A^{-1}
print(solve(A))

# Reproduktion der definierenden Eigenschaft von A^{-1}
print(solve(A) %*% A)
print(A %*% solve(A))
```
\normalsize

Man beachte, dass sich bei der rechtsseitigen Multiplikation von $A$ mit ihrer
inversen minimale Rundungsfehler eingeschlichen haben. Die in der Vorlesung
beispielhaft betrachtete nicht-invertierbare Matrix ist auch numerisch nicht
invertierbar, wie folgender Beispielcode demonstriert.

\footnotesize
```{r, error = TRUE}

# Nicht-invertierbare Matrizen sind auch numerisch nicht-invertierbar (singulär)
B = matrix(c(1,0,
             0,0),
           nrow  = 2,
           byrow = 2)
solve(B)
```
\normalsize

Determinanten berechnet man in **R** mithilfe des Befehls `det()`. Für die 
in der Vorlesung betrachteten Beispiele ergibt sich folgender **R** Code.

\footnotesize
```{r}
# Beispiel 1
A = matrix(c(2,1,                  # Matrixdefinition
             3,4),
           nrow = 2,
           byrow = TRUE)
det(A)                             # Determinantenberechnung

B = matrix(c(1,0,                  # Matrixdefinition
             0,0),
           nrow = 2,
           byrow = TRUE)
det(B)                             # Determinantenberechnung

# Beispiel 2
C = matrix(c(2,0,0,                # Matrixdefinition
             0,1,0,
             0,0,3),
           nrow = 3,
           byrow = TRUE)
det(C)                             # Determinantenberechnung
```
\normalsize

## Optionale Aufgaben zur Übung

(1) Es seien 
\begin{equation}
A :=
\begin{pmatrix*}[r]
1 & 2 \\
2 & 1
\end{pmatrix*},
B :=
\begin{pmatrix*}[r]
3 & 0 \\
1 & 2
\end{pmatrix*},
\mbox{ und }
c := 2
\end{equation}
Berechnen Sie
\begin{equation}
D := c\left(A - B^T\right)
\mbox{ und }
E := \left(cA\right)^T + B.
\end{equation}
mit **R**.

```{r, eval = F, echo = F}
# Definitionen
A = matrix(c(1,2,
             2,1),
           nrow  = 2,
           byrow = TRUE)
B = matrix(c(3,0,
             1,2),
           nrow  = 2,
           byrow = TRUE)
c = 2

# Evaluation
print(A)
print(B)
print(c*(A - t(B)))
print(t(c*A) + B)
```
(2) Es seien
\begin{equation}
A :=
\begin{pmatrix*}[r]
1 & 2 & 3 \\
4 & 5 & 6 \\
3 & 2 & 0
\end{pmatrix*}
B :=
\begin{pmatrix*}[r]
1 & 2 & 2 \\
1 & 3 & 1 \\
2 & 0 & 0
\end{pmatrix*}
\mbox{ und }
C :=
\begin{pmatrix*}[r]
1 \\ 3 \\ 2
\end{pmatrix*}.
\end{equation}
Berechnen Sie die Matrixprodukte
\begin{equation}
AB , \quad\quad
B^TA^T, \quad\quad
\left(B^TA^T\right)^T \mbox{ und }
AC
\end{equation}
mit **R**.

```{r, eval = F, echo = F}
# Definitionen
A = matrix(c(1,2,3,
             4,5,6,
             3,2,0),
           nrow  = 3,
           byrow = TRUE)
B = matrix(c(1,2,2,
             1,3,1,
             2,0,0),
           nrow  = 3,
           byrow = TRUE)
C = matrix(c(1,3,2),
           nrow  = 3,
           byrow = TRUE)
print(A)
print(B)
print(C)
print(A %*% B)
print(t(B) %*% t(A))
print(t(t(B) %*% t(A)))
print(A %*% C)
```

(3) Invertieren Sie die Matrizen $A$ und $B$ aus der vorherigen Aufgabe mithilfe
von `solve()` und überprüfen Sie die Inverseeigenschaft der inversen Matrizen 
mithilfe von **R**.

```{r, eval = F, echo = F}
# Matrixinversion
A = matrix(c(1,2,3,
             4,5,6,
             3,2,0),
           nrow  = 3,
           byrow = TRUE)
B = matrix(c(1,2,2,
             1,3,1,
             2,0,0),
           nrow  = 3,
           byrow = TRUE)
print(solve(A))
print(solve(B))
print(solve(A) %*% A)
print(solve(B) %*% B)
print(solve(B) %*% B)

```

(4) Berechnen Sie die Determinanten von
\begin{equation}
A := \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}, 
B := \begin{pmatrix} 3 & 2 & 1 \\ 2 & 3 & 2 \\ 1 & 2 & 3 \end{pmatrix} \mbox{ und }
C := \mbox{diag}(1,2,3)
\end{equation}
mit **R**.


```{r, eval = F, echo = F}
# Definitionen
A = matrix(c(2,1,
             1,2),
           nrow  = 2,
           byrow = TRUE)
B = matrix(c(3,2,1,
             2,3,2,
             1,2,3),
           nrow  = 3,
           byrow = TRUE)
C = diag(c(1,2,3))

# Evaluation
print(det(A))
print(det(B))
print(det(C))
```
