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 com a mínim una de les dues, o el nombre de files o el de columnes.

A <- matrix(c(2, 0, 3, 4, 7, 5,  5, 4, 9, 10), ncol = 5)
A
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    3    7    5    9
[2,]    0    4    5    4   10
B <- matrix(data=c(2, 3, 7, 5, 9, 0, 4, 5, 4, 10), byrow = TRUE, nrow = 2)
B
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    3    7    5    9
[2,]    0    4    5    4   10

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.

A[2,3] # serà l'element de la fila 2 i columna 3
[1] 5
A[,3]  # si no diem quina fila, les torna totes
[1] 7 5
A[1,]  # si no diem quina columna les torna totes
[1] 2 3 7 5 9

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.

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
     [,1] [,2] [,3] [,4] [,5]
[1,] TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE
B[1,3]=13 # canviem l'element (1,3)
A == B
     [,1] [,2]  [,3] [,4] [,5]
[1,] TRUE TRUE FALSE TRUE TRUE
[2,] TRUE TRUE  TRUE TRUE TRUE
all(A == A) # per veure si tots són TRUE
[1] TRUE
all(A == B)
[1] FALSE

Suma, diferència, producte per escalars de matrius

Aquí treballem amb matrius igual que amb nombres.

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
     [,1] [,2] [,3]
[1,]    2    2    8
[2,]    2    2    6
A - 2 * B
     [,1] [,2] [,3]
[1,]   -1    2   -7
[2,]   -1   -1  -12
3 * A
     [,1] [,2] [,3]
[1,]    3    6    9
[2,]    3    3    0
-B
     [,1] [,2] [,3]
[1,]   -1    0   -5
[2,]   -1   -1   -6

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 %*%.

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
     [,1] [,2]
[1,]   13   20
[2,]   -2  -12
B %*% A  # serà matriu 4 x 4
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    6   10   13    6
[3,]    7    2   -9    7
[4,]   -1   -2   -3   -1

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

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
     [,1] [,2] [,3]
[1,]   26    0    2
[2,]    3    2    1
[3,]    9   -1    1
B %*% A
     [,1] [,2] [,3]
[1,]   -1   -3   -6
[2,]    4   12   15
[3,]    5   11   18
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
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

La matriu identitat

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

I5 <- diag(1, nrow = 5)
I5
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    1    0
[5,]    0    0    0    0    1

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

Potència de matrius quadrades

A <- matrix(c(1, 0, 3, 0.5), nrow=2)
A %*% A
     [,1] [,2]
[1,]    1 4.50
[2,]    0 0.25
A %*% A %*% A %*% A
     [,1]   [,2]
[1,]    1 5.6250
[2,]    0 0.0625

La transposada

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

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
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
t(C)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
t(A %*% B) == t(B) %*% t(A)
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

Matrius simètriques

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?
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

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:

A <- matrix(runif(9), byrow = TRUE, nrow = 3)
diag(A)
[1] 0.4733754 0.1771627 0.5087767
sum(diag(A)) # serà la traça
[1] 1.159315

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

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)
     [,1]         [,2]
[1,]    1 6.000000e+00
[2,]    0 7.888609e-31

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}\).