00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.