Matrici in R
Le matrici in R sono strutture dati bidimensionali composte da righe e colonne, dove tutti gli elementi devono essere dello stesso tipo. Sono fondamentali per l’algebra lineare, le operazioni statistiche e la manipolazione di dati tabulari. R offre un supporto nativo e completo per le operazioni matriciali.
Creare Matrici con matrix()
La funzione matrix() è il modo principale per creare una matrice, specificando i dati, il numero di righe e colonne:
# Matrice 3x3 riempita per colonna (default)
m1 <- matrix(1:9, nrow = 3, ncol = 3)
print(m1)
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
# Matrice riempita per riga con byrow = TRUE
m2 <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE)
print(m2)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
# Matrice con un valore ripetuto
zeri <- matrix(0, nrow = 2, ncol = 4)
print(zeri)
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 0
# [2,] 0 0 0 0
Quando si specifica solo nrow o solo ncol, R calcola automaticamente l’altra dimensione in base alla lunghezza dei dati forniti.
Accesso agli Elementi
Per accedere agli elementi di una matrice si usa la notazione [riga, colonna]:
m <- matrix(c(10, 20, 30, 40, 50, 60, 70, 80, 90), nrow = 3, byrow = TRUE)
print(m)
# [,1] [,2] [,3]
# [1,] 10 20 30
# [2,] 40 50 60
# [3,] 70 80 90
# Singolo elemento: riga 2, colonna 3
print(m[2, 3])
# [1] 60
# Intera riga (riga 1)
print(m[1, ])
# [1] 10 20 30
# Intera colonna (colonna 2)
print(m[, 2])
# [1] 20 50 80
# Sotto-matrice: righe 1-2, colonne 2-3
print(m[1:2, 2:3])
# [,1] [,2]
# [1,] 20 30
# [2,] 50 60
# Escludere una riga o colonna
print(m[-3, ]) # Tutto tranne la riga 3
# [,1] [,2] [,3]
# [1,] 10 20 30
# [2,] 40 50 60
Dimensioni della Matrice
R fornisce diverse funzioni per ottenere informazioni sulle dimensioni:
m <- matrix(1:12, nrow = 3, ncol = 4)
# Dimensioni complete
print(dim(m))
# [1] 3 4
# Numero di righe
print(nrow(m))
# [1] 3
# Numero di colonne
print(ncol(m))
# [1] 4
# Numero totale di elementi
print(length(m))
# [1] 12
Assegnare Nomi a Righe e Colonne
Per rendere le matrici piu leggibili, si possono assegnare nomi a righe e colonne:
vendite <- matrix(c(150, 200, 180, 220, 170, 250), nrow = 2, byrow = TRUE)
rownames(vendite) <- c("Negozio_A", "Negozio_B")
colnames(vendite) <- c("Gennaio", "Febbraio", "Marzo")
print(vendite)
# Gennaio Febbraio Marzo
# Negozio_A 150 200 180
# Negozio_B 220 170 250
# Accesso per nome
print(vendite["Negozio_A", "Febbraio"])
# [1] 200
Combinare Matrici con rbind() e cbind()
Le funzioni rbind() e cbind() permettono di combinare matrici aggiungendo righe o colonne:
m1 <- matrix(1:6, nrow = 2)
print(m1)
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
m2 <- matrix(7:12, nrow = 2)
print(m2)
# [,1] [,2] [,3]
# [1,] 7 9 11
# [2,] 8 10 12
# rbind: aggiunge righe (una matrice sotto l'altra)
r <- rbind(m1, m2)
print(r)
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# [3,] 7 9 11
# [4,] 8 10 12
# cbind: aggiunge colonne (una matrice accanto all'altra)
c_mat <- cbind(m1, m2)
print(c_mat)
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 3 5 7 9 11
# [2,] 2 4 6 8 10 12
Operazioni Aritmetiche Elemento per Elemento
Le operazioni aritmetiche di base agiscono elemento per elemento:
a <- matrix(c(1, 2, 3, 4), nrow = 2)
b <- matrix(c(5, 6, 7, 8), nrow = 2)
# Somma elemento per elemento
print(a + b)
# [,1] [,2]
# [1,] 6 10
# [2,] 8 12
# Moltiplicazione elemento per elemento
print(a * b)
# [,1] [,2]
# [1,] 5 21
# [2,] 12 32
# Moltiplicazione per uno scalare
print(a * 3)
# [,1] [,2]
# [1,] 3 9
# [2,] 6 12
Prodotto Matriciale con %*%
Per il prodotto matriciale classico dell’algebra lineare, R utilizza l’operatore speciale %*%:
a <- matrix(c(1, 2, 3, 4), nrow = 2)
b <- matrix(c(5, 6, 7, 8), nrow = 2)
# Prodotto matriciale (diverso da a * b)
prodotto <- a %*% b
print(prodotto)
# [,1] [,2]
# [1,] 23 31
# [2,] 34 46
# Verifica dimensioni: (2x2) %*% (2x2) = (2x2)
# Per matrici rettangolari:
x <- matrix(1:6, nrow = 2, ncol = 3) # 2x3
y <- matrix(1:6, nrow = 3, ncol = 2) # 3x2
risultato <- x %*% y # 2x2
print(risultato)
# [,1] [,2]
# [1,] 22 49
# [2,] 28 64
Trasposta con t()
La funzione t() restituisce la trasposta di una matrice, scambiando righe e colonne:
m <- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
print(m)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
trasposta <- t(m)
print(trasposta)
# [,1] [,2]
# [1,] 1 4
# [2,] 2 5
# [3,] 3 6
Determinante con det()
Il determinante di una matrice quadrata si calcola con det():
m <- matrix(c(3, 1, 2, 4), nrow = 2)
print(m)
# [,1] [,2]
# [1,] 3 2
# [2,] 1 4
print(det(m))
# [1] 10
# Matrice 3x3
m3 <- matrix(c(1, 2, 3, 0, 4, 5, 1, 0, 6), nrow = 3, byrow = TRUE)
print(det(m3))
# [1] 22
# Matrice singolare (determinante = 0, non invertibile)
singolare <- matrix(c(1, 2, 2, 4), nrow = 2)
print(det(singolare))
# [1] 0
Applicare Funzioni con apply()
La funzione apply() permette di applicare una funzione lungo le righe o le colonne di una matrice:
punteggi <- matrix(c(85, 90, 78, 92, 88, 76, 95, 82, 89), nrow = 3, byrow = TRUE)
rownames(punteggi) <- c("Alice", "Bob", "Carlo")
colnames(punteggi) <- c("Test1", "Test2", "Test3")
print(punteggi)
# Test1 Test2 Test3
# Alice 85 90 78
# Bob 92 88 76
# Carlo 95 82 89
# apply con MARGIN = 1: applica per RIGA
medie_studenti <- apply(punteggi, 1, mean)
print(medie_studenti)
# Alice Bob Carlo
# 84.33333 85.33333 88.66667
# apply con MARGIN = 2: applica per COLONNA
medie_test <- apply(punteggi, 2, mean)
print(medie_test)
# Test1 Test2 Test3
# 90.66667 86.66667 81.00000
# Applicare funzioni personalizzate
range_per_riga <- apply(punteggi, 1, function(x) max(x) - min(x))
print(range_per_riga)
# Alice Bob Carlo
# 12 16 13
Altre Operazioni Utili
m <- matrix(c(4, 7, 2, 6), nrow = 2)
# Inversa di una matrice
inversa <- solve(m)
print(inversa)
# [,1] [,2]
# [1,] 0.6 -0.2
# [2,] -0.7 0.4
# Verifica: M * M^(-1) = I (matrice identita)
print(round(m %*% inversa))
# [,1] [,2]
# [1,] 1 0
# [2,] 0 1
# Matrice identita
identita <- diag(3)
print(identita)
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 1 0
# [3,] 0 0 1
Conclusione
Le matrici in R sono strumenti potenti per il calcolo numerico e l’algebra lineare. La possibilità di creare matrici con matrix(), combinarle con rbind() e cbind(), eseguire il prodotto matriciale con %*%, calcolare trasposta, determinante e inversa rende R un ambiente completo per le operazioni matriciali. La funzione apply() aggiunge la capacita di elaborare righe e colonne in modo efficiente, rendendo le matrici una scelta eccellente per l’analisi dati strutturati.