A ^ k pour la multiplication matricielle dans R?
Supposons que Un est certains matrice carrée. Comment puis-je facilement exponentiate cette matrice R?
J'ai essayé de deux façons déjà: Essai 1 avec une boucle for hack et 2 Essai un peu plus élégante, mais elle est encore loin de Unk la simplicité.
Essai 1
set.seed(10)
t(matrix(rnorm(16),ncol=4,nrow=4)) -> a
for(i in 1:2){a <- a %*% a}
Essai 2
a <- t(matrix(c(0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0),nrow=4))
i <- diag(4)
(function(n) {if (n<=1) a else (i+a) %*% Recall(n-1)})(10)
source d'informationauteur hhh | 2012-02-27
Vous devez vous connecter pour publier un commentaire.
Bien que
Reduce
est plus élégant, d'une boucle for solution est plus rapide et semble être aussi rapide que expm::%^%Sur l'autre côté de la matrice.solution d'alimentation est beaucoup, beaucoup plus lent:
@BenBolker est correct (encore une fois). La boucle for s'affiche linéaire dans le temps que l'exposant augmente alors que la expm::%^% fonction semble être encore mieux que log(exposant).
La
expm
paquet a une%^%
opérateur:Si
A
est diagonizable, vous pouvez utiliser la valeur propre de décomposition:Lorsque A n'est pas diagonalizable, la matrice
M
(matrice des vecteurs propres) est singulier. Ainsi, en l'utilisant avecA = matrix(c(0,1,0,0),2,2)
donneraitError in solve.default(M) : system is computationally singular
.Une solution plus courte avec la valeur propre de décomposition:
En effet, le expm du package n'utilisez l'exponentiation par la quadrature.
Dans la pure r, ce qui peut être fait plutôt efficace comme,
Délai,
Donc, comme prévu, ils sont la même vitesse, car ils utilisent le même algorithme. Il ressemble à la surcharge de la boucle de la r code ne fait pas une différence significative.
Donc, si vous ne voulez pas utiliser expm, et la nécessité que les performances, alors vous pouvez simplement utiliser, si vous n'avez pas l'esprit en regardant du code impératif.
Voici une solution qui n'est pas très efficace mais qui fonctionne et qui est facile à comprendre et à mettre en œuvre les œuvres de la base, et fonctionne presque instantanément en dépit d'être beaucoup moins efficace que, par exemple, la
expm
solution:par exemple,
Encore une fois, si l'efficacité est primordiale, les autres réponses sont de loin supérieure. Mais cela nécessite moins de codage frais généraux et pas de paquets pour les situations où vous voulez juste pour calculer la matrice des pouvoirs dans votre brouillon de travail.