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