Les matrices creuses ou sparse matrix sont des matrices qui contiennent beaucoup de zéros (ex : matrice d’adjacence, matrice diagonale…). Ces matrices peuvent prendre beaucoup de place et il est donc judicieux d’utiliser des fonctions spéciales pour ce genre de matrice afin de les rendre plus légères : les valeurs nulles vont être remplacées par un point .
.
Matrix
##
## Attaching package: 'Matrix'
## The following object is masked from 'package:tidyr':
##
## expand
m1 <- matrix(0, nrow = 1000, ncol = 1000)
m2 <- Matrix(0, nrow = 1000, ncol = 1000, sparse = TRUE)
m1[1:5, 1:5]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
## [3,] 0 0 0 0 0
## [4,] 0 0 0 0 0
## [5,] 0 0 0 0 0
## 8000216 bytes
## 5 x 5 sparse Matrix of class "dsCMatrix"
##
## [1,] . . . . .
## [2,] . . . . .
## [3,] . . . . .
## [4,] . . . . .
## [5,] . . . . .
## 5728 bytes
Selon le type de données que l’on possède plusieurs stratégies de création de matrice creuse sont possibles.
as
ou Matrix
## 40216 bytes
## 13728 bytes
## 13728 bytes
Par défaut, lorsque l’on renseigne la classe sparseMatrix
la compression se fera automatiquement par colonne, mais il est possible de choisir entre une compression par ligne ou par colonne avec les arguments suivant :
as(dt, "dgCMatrix")
as(dt, "dgRMatrix")
Ce choix de compression peut s’avérer utile si l’on veut travailler par ligne ou par colonne.
Autre choix de compression :
Class | Compression | Type |
---|---|---|
ngeMatrix | none | logicals |
dgeMatrix | none | real numbers |
dgCMatrix | compressed sparse column | real numbers |
dgRMatrix | compressed sparse row | real numbers |
ngCMatrix | compressed sparse column | logicals |
ngRMatrix | compressed sparse row | real numbers |
sparseMatrix
:# Génération de la matrice sous forme de triplet
# Avec :
# - i : indices des lignes
# - j : indices des colonnes
# - k : valeurs non-nulles
i <- c(1, 1, 5, 4, 2, 1, 3)
j <- c(3, 4, 4, 1, 2, 2, 4)
k <- c(4, 5, 7, 1, 3, 2, 6)
i <- sample(100, 50, replace = FALSE)
j <- sample(100, 50, replace = FALSE)
k <- sample(100, 50, replace = FALSE)
my.matrix <- matrix(ncol = 100, nrow = 100, 0)
s <- sapply(1:100, function(ii) {
my.matrix[i[ii], j[ii]] <<- k[ii]
})
object.size(my.matrix)
## 80216 bytes
Pour transformer notre matrice en sparseMatrix, on utilise sa décomposition en triplet :
## 2504 bytes
ou comme expliqué auparavant avec :
## 2504 bytes
## 2504 bytes
slam
slam.matrix <- simple_triplet_matrix(i = i, j = j, v = k)
# ou
slam.matrix <- as.simple_triplet_matrix(my.matrix)
object.size(slam.matrix)
## 1952 bytes
Attention :
## A 100x100 simple triplet matrix.
slam
ne permet pas de visualiser la forme de la matrice comme on a pu le voir avec Matrix
, mais l’ensemble du triplet est renseigné dans les arguments de la fonction :
La taille des matrice obtenue précédemment à l’aide de slam
et Matrix
ne sont pas de taille similaire mais sela peut s’expliquer par la simulation d’une petite matrice. Il est important de savoir que transformer une matrice pleine en matrice creuse n’est intéressant que si on travaille sur de très grosses matrices et au moins 50% de présence de valeurs nulles.
Les matrices creuses prennent donc moins de place et se stockent dans l’environnement R plus facilement ce qui peut entrainer une réduction considérable du temps de calcul.