Suppression d'éléments de la diagonale de la matrice dans la R
Comment puis-je supprimer les éléments de la diagonale (diagL) de ma matrice L utilisation de R? J'ai essayé d'utiliser les éléments suivants:
subset(L, select=-diag(L)) or
subset(L, select=-c(diag(L)))
mais j'obtiens 0 chiffres...
Ce que le langage de l'ordinateur que vous utilisez?
Quelle langue? Qu'entendez-vous par supprimer? Set à zéro?
Je veux dire de les supprimer de la matrice
Quelle langue? Qu'entendez-vous par supprimer? Set à zéro?
Je veux dire de les supprimer de la matrice
OriginalL'auteur Titi90 | 2013-09-16
Vous devez vous connecter pour publier un commentaire.
La R langage de programmation? J'aime C mieux, il est plus facile à épeler.
Une façon est de créer une matrice avec les numéros de la façon dont je l'aime à regarder:
qui ressemble à:
Supprimer les valeurs sur la diagonale:
qui se traduit par:
Pour SUPPRIMER réellement les valeurs, plutôt que de simplement faire disparaître, nous avons besoin d'une refonte de:
Qui se traduit par:
qui est la même chose que nous avons obtenu en C, ci-dessus.
C'est un peu long, mais il en résulte ce que je vois comme une bonne réponse. Je serais intéressé à voir une meilleure solution, par quelqu'un qui sait R mieux que moi.
Un peu d'explication sur l'affectation:
!is.na(a)
nous donne une liste de VRAI, de FAUSSES valeurs pour les éléments qui ont été annulées.which(!is.na(a))
nous donne une liste d'indices pour chacune des vrais éléments.t(a)
transpose la matrice puisque nous devons tirer basée sur les indices en #2.t(a)[which(!is.na(a))]
nous donne une liste de nombres qui est absent de la diagonale NA valeurs.matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4)
convertit la liste de #4 dans une matrice, qui est la transposition de ce que nous voulons.a<-t(matrix(1:16,nrow=4,ncol=4))
(le tout) transpose #5 dans la forme que nous voulons et l'attribue à l'a
variable.Cela fonctionne avec des cas comme
a<-t(matrix(11:26,nrow=4,ncol=4))
.OriginalL'auteur
Voici quelques artificielle de données à des fins d'illustration:
Après la vectorisation de la matrice
x
, les éléments de la diagonale correspondent aux indices1, n+2, 2*n+3, ...
, qui est, à la séquenceseq(1, n^2, n+1)
. Vous pouvez supprimer ces indices parAprès le "retrait de la diagonale de la matrice, vous pouvez décaler le bas matrice triangulaire vers le haut pour obtenir une matrice avec
n-1
lignes etn
colonnes parou bien, et c'est probablement ce que vous voulez, vous pouvez changer la matrice triangulaire inférieure vers la droite pour obtenir une matrice avec
n
lignes etn-1
colonnes en transposantx
avant de retirer la diagonale des indices et de la transposition de revenir par la suiteOriginalL'auteur sieste
Gardez à l'esprit que la diagonale va avoir le même X et de Y index. Un programme rapide à zéro sur la diagonale en C suit:
Il en résulte:
Pour SUPPRIMER plutôt que de simplement effacer la diagonale est plus compliqué.
Cela devrait faire l'affaire: (Gardez à l'esprit qu'un memcpy de zéro octets peuvent inclure des éléments qui ne sont pas là.)
Résultats dans:
Bien sûr, si vous voulez quelque chose dans une autre langue, il contribue à poser.
OriginalL'auteur