---
title: "Matrius-guia17-mates1-21"
author: "f.u., a.g."
date: "1/28/2021"
output:
  pdf_document: default
  html_document: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
knitr::opts_chunk$set(comment = "")
```

## Definició i notacions

Creem una matriu en R amb la funció `matrix()`. Hem de donar els elements de la matrius en ordre en una sola seqüència, per defecte per columnes. Si ho volem donar per files, hem d'especificar `byrow = TRUE`. Cal especificar el nombre de files o el de columnes, com a mínim una de les dues.


```{r}
A <- matrix(c(2, 0, 3, 4, 7, 5,  5, 4, 9, 10), ncol = 5)
A
```

```{r}
B <- matrix(data=c(2, 3, 7, 5, 9, 0, 4, 5, 4, 10), byrow = TRUE, nrow = 2)
B
```

Podem accedir a l'element $a_{i,j}$ de la matriu utilitzant la notació `A[i,j]`

Però recorda que R diferencia entre `A` i `a`. La matriu l'hem definit amb `A` majúscula i la `a` minúscula és una altra variable de R.

```{r}
A[2,3] # serà l'element de la fila 2 i columna 3
A[,3]  # si no diem quina fila, les torna totes
A[1,]  # si no diem quina columna les torna totes
```

En la notació més habitual el que hem demanat s'escriuria la columna $a_{\cdot 3}$ i la fila $a_{1\cdot}$ (posem un puntet per indicar tota la fila o tota la columna).

Atenció: quan demanem una fila o una columna, R ens torna sempre un vector fila, horitzontal.


### Igualtat de matrius

Si demanem si dues matrius són iguals, R ens torna la comparació terme a terme.

```{r }
A <- matrix(c(2, 0, 3, 4, 7, 5,  5, 4, 9, 10), nrow = 2)
B <- matrix(c(2, 0, 3, 4, 7, 5,  5, 4, 9, 10), ncol = 5)
A == B
B[1,3]=13 # canviem l'element (1,3)
A == B
all(A == A) # per veure si tots són TRUE
all(A == B)
```

### Suma, diferència, producte per escalars de matrius

Aquí treballem amb matrius igual que amb nombres.

```{r}
A <- matrix(c(1, 2, 3, 1, 1, 0), byrow = TRUE, nrow = 2)
B <- matrix(c(1, 0, 5, 1, 1, 6), byrow = TRUE, nrow = 2)
A + B
A - 2 * B
3 * A
-B
```

### El producte de matrius. No és commutatiu!

Si fem servir el producte de nombres `*`, R fa el producte terme a terme. El producte matricial es fa amb `%*%`.

```{r}
A <- matrix(c(1, 2, 3, 1, 1, 0, -2, 1), byrow = TRUE, nrow = 2) # matriu 2 x 4
B <- matrix(c(1, 0, 5, 1, 1, 6, -1, 0), byrow = TRUE, nrow = 4) # matriu 4 x 2
A %*% B  # serà matriu 2 x 2
B %*% A  # serà matriu 4 x 4
```

En el cas de matrius quadrades sempre podem canviar l'ordre del producte, de vegades el resultat serà el mateix, de vegades no.

```{r}
A <- matrix(c(1, 2, 3, 1, 1, 0, -2, 1, 0), byrow = TRUE, nrow = 3) # matriu 3 x 3
B <- matrix(c(-2, 1, 0, 5, 1, 1, 6, -1, 0), byrow = TRUE, nrow = 3) # matriu 3 x 3
A %*% B
B %*% A
C <- diag(c(1,2,3)) # matriu diagonal amb 1, 2, 3 a la diagonal
D <- diag(c(2,-1, 0))
D %*% C == C %*% D
```

### La matriu identitat

Amb la funció *diag* que hem fet  servir suara, podem construir la matriu identitat de la dimensió que ens interessi

```{r}
I5 <- diag(1, nrow = 5)
I5
```

Com has vist, no cal que donem `1` cinc vegades, R recicla el que donem si li cal.

### Potència de matrius quadrades

```{r}
A <- matrix(c(1, 0, 3, 0.5), nrow=2)
A %*% A
A %*% A %*% A %*% A
```



### La transposada

Fem servir la funció `t()` per transposar matrius.

```{r}
A <- matrix(c(1, 2, 3, 1, 1, 0, -2, 1, 0), byrow = TRUE, nrow = 3) # matriu 3 x 3
B <- matrix(c(-2, 1, 0, 5, 1, 1, 6, -1, 0), byrow = TRUE, nrow = 3) # matriu 3 x 3
C <- matrix(1:12, nrow = 3)  # matriu 3 x 4 omplerta amb els nombres del 1 al 12 per columnes
C
t(C)
t(A %*% B) == t(B) %*% t(A)
```

### Matrius simètriques

```{r}
A <- matrix(c(1, 2, 3, 1, 1, 0, -2, 1, 0), byrow = TRUE, nrow = 3) # matriu 3 x 3
TA <- A %*% t(A)
TA == t(TA)  # és una matriu simètrica?
```

### Traça d'una matriu quadrada

No hi ha una funció específica en R per calcular la traça, no cal. La funció `diag()` que abans hem fet servir per construir una matriu diagonal a partir dels nombres de la diagonal, també serveix per extreure la diagonal d'una matriu.

Aqui construirem una matriu amb nombres aleatoris de $[0,1]$ i en farem la traça:

```{r}
A <- matrix(runif(9), byrow = TRUE, nrow = 3)
diag(A)
sum(diag(A)) # serà la traça
```

## Exercicis

Ara et toca a tu. 

1.- Comprova la propietat associativa del producte de matrius amb tres matrius de dimensions 2 per 3, 3 per 4 i 4 per 2.

2.- Producte de matriu i vector. Si entrem un vector en R fent servir la funció `c()`, R d'entrada l'interpreta con un vector fila (de fet com un vector sense dimensions). Però quan el fem servir en un producte matricial, R el "promou" a les dimensions adequades. Comprova-ho amb alguns exemples: fes una matriu de 3 per 4, pre-multiplica-la per `v <- c(1,0,-1)` i comprova si ha interpretat `v` com a un vector fila de 1 per 3. Post-multiplica-la per `w <- c(1,0,-1,-2)` i comprova si ha interpretat correctament `w` com a vector columna de 4 per 1.


Podeu trobar un resum de com treballar amb matrius en R al web (https://www.statmethods.net/advstats/matrix.html), amb més funcions de les que hem vist aquí.

## Només per friquis del R
(o gent interesada en aprendre a programar)

Si volguéssim fer potències d'exponent més alt, podem definir

```{r}
potencia.matriu <- function(matriu, exponent) {
  if(exponent==1) 
    return(matriu)
  else
    return(matriu %*% potencia.matriu(matriu, exponent-1))}

A <- matrix(c(1, 0, 3, 0.5), nrow=2)
potencia.matriu(A, 100)
```

Hem definit la funció `potencia.matriu(A,n)` com a una funció _recursiva_, dient que $A^1$ és $A$ i $A^n$ és $A\cdot A^{n-1}$. 

