La somme cumulée dans une matrice
J'ai une matrice comme
A= [ 1 2 4
2 3 1
3 1 2 ]
et je voudrais calculer le cumul de la somme par ligne et par colonne, qui est, je veux que le résultat soit
B = [ 1 3 7
3 8 13
6 12 19 ]
Toutes les idées de comment faire cela dans la R dans un moyen rapide? (Éventuellement à l'aide de la fonction cumsum)
(J'ai énormément de matrices)
Merci!
Vous devez vous connecter pour publier un commentaire.
Un one-liner:
Le sous-jacent de l'observation, c'est que vous pouvez tout d'abord calculer les sommes cumulées sur les colonnes, puis la somme cumulée de cette matrice sur les rangées.
Remarque: Lorsque vous effectuez les lignes, vous avez à transposer la matrice résultante.
Votre exemple:
Sur les performances: j'ai maintenant l'idée à quel point cette approche échelles de grandes matrices. Complexité-sage, ce devrait être proche de l'optimal. Généralement,
apply
n'est pas que du mauvais dans les performances.Modifier
Maintenant je recevais des curieux quelle approche est la meilleure? Un court de référence:
Ainsi: Appliquer surpasse la matrice de multiplication par un facteur de 15 ans. (Juste pour la comparaison: MATLAB nécessaire 0.10719 secondes.) Les résultats ne sont pas vraiment la surprise, comme le
apply
-version peut être fait en O(n^2), tandis que la multiplication de matrice aurez besoin env. O(n^2.7) les calculs. Ainsi, toutes les optimisations que la matrice de la multiplication des offres devraient être perdu si n est assez grand.A
).tril(ones(3,3)) * A * triu(ones(3,3))
. R malheureusement n'offre pas un bon support pour les matrices triangulaires, en créant adapté matrices probablement de tuer tous les gains de vitesse qui pourrait être archivés par la multiplication de matrice. Excellente idée, cependant.diag()
s'est faufilé là.lower.tri(A,T) %*% A %*% upper.tri(A,T)
dans R.lower.tri(diag(nrow(A)), diag = TRUE) %*% A %*% upper.tri(diag(ncol(A)), diag = TRUE)
pour gérer les matrices rectangulaires. Il n'a pas d'échelle ainsi que Thilo doubleapply
solution ci-dessus si.Voici une application plus efficace à l'aide de la matrixStats package et un plus grand exemple de la matrice: