2 votes

Attribuer des valeurs "sparse" à la diagonale d'une matrice sparse dans R

Je souhaite assigner des valeurs vides ou éparses dans une matrice éparse dans R. Plus précisément, je souhaite supprimer toutes les valeurs de la diagonale d'une matrice éparse à partir du package Matrix. Pour l'instant, je ne peux qu'assigner des 0 non épars dans la diagonale et les supprimer ensuite avec la fonction drop0.

Existe-t-il un moyen d'assigner des valeurs vides directement dans la diagonale d'une matrice peu dense ?

Le code suivant illustre le problème :

    library(Matrix)
    m       <- Diagonal(10) 
    diag(m) <- 0
    m
    drop0(m)

J'aimerais sauter l'étape drop0(m). Dans mon analyse réelle, j'ai des valeurs hors diagonales que je veux garder pour une analyse de réseau, donc je ne suis pas vraiment intéressé par une matrice vide mais par un moyen d'assigner des valeurs "éparses" ou "vides" dans une matrice éparse.

1voto

Roland Points 37641

Je suppose que vous avez bien une matrice de classe ddiMatrix et souhaite créer une matrice vide :

m1 <- as(m, "generalMatrix")
m1@i <- integer(0)
m1@p <- m1@p * 0L
m1@x <- numeric(0)
#10 x 10 sparse Matrix of class "dgCMatrix"
#                         
# [1,] . . . . . . . . . .
# [2,] . . . . . . . . . .
# [3,] . . . . . . . . . .
# [4,] . . . . . . . . . .
# [5,] . . . . . . . . . .
# [6,] . . . . . . . . . .
# [7,] . . . . . . . . . .
# [8,] . . . . . . . . . .
# [9,] . . . . . . . . . .
#[10,] . . . . . . . . . .

Bien entendu, vous pouvez également construire une nouvelle matrice vide de ces dimensions.

Si vous avez un CsparseMatrix avec des valeurs hors diagonale, la contraindre à une valeur de TsparseMatrix et supprimer tous les i , j , x lorsque i == j (ou ignorer la coercition et calculer les indices corrects à partir de i y p ce que je trouve difficile).

m1 <- as(m, "generalMatrix")

m2 <- as(m1, "TsparseMatrix")

del <- m2@i == m2@j
m2@i <- m2@i[!del]
m2@j <- m2@j[!del]
m2@x <- m2@x[!del]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X