Efficacement répliquer les matrices dans la R
J'ai une matrice et cherchez un moyen efficace pour répliquer il n fois (où n est le nombre d'observations dans le jeu de données). Par exemple, si j'ai une matrice A
A <- matrix(1:15, nrow=3)
puis j'ai envie d'une sortie de la forme
rbind(A, A, A, ...) #n times
.
Évidemment, il existe de nombreuses façons de construire une telle matrice de grande taille, par exemple à l'aide d'un for
boucle ou apply
ou des fonctions similaires. Toutefois, l'appel à la "matrice de la réplication de la fonction" prend place dans le cœur de mon algorithme d'optimisation où il est appelé des dizaines de milliers de fois durant une exécution de mon programme. Par conséquent, les boucles, appliquez-type de fonctions et quelque chose de similaire qui ne sont pas assez efficaces. (Une telle solution serait fondamentalement signifie qu'une boucle sur n est effectuée à des dizaines de milliers de fois, ce qui est évidemment inefficace.) J'ai déjà essayé d'utiliser l'ordinaire rep
de la fonction, mais n'ont pas trouvé une façon d'organiser la sortie de rep
dans une matrice de format souhaité.
La solution
do.call("rbind", replicate(n, A, simplify=F))
est également trop inefficace, parce que rbind
est utilisé trop souvent dans ce cas. (Puis, environ 30% de la durée totale d'utilisation de mon programme sont passé à effectuer les rbinds.)
Quelqu'un sait-il une meilleure solution?
rbind
est seulement utilisé une fois dans ledo.call
façon. c'est la réplication, qui est probablement l'entraînant vers le bas.- Je l'ai testé avec
Rprof
etrbind
a pris environ deux fois plus de temps quereplicate
. J'ai également été surpris par cela.
Vous devez vous connecter pour publier un commentaire.
Deux autres solutions:
La première est une modification de l'exemple de la question
La deuxième consiste à dérouler la matrice, la réplique, et remontage.
Depuis l'efficience est ce qui a été demandé, l'étalonnage est nécessaire
qui donne:
De sorte que le plus rapide est le cru
rbind
appel, mais qui supposen
est fixe et connu à l'avance. Sin
n'est pas fixée, le plus rapide estdo.call("rbind", rep(list(A), n)
. Ils ont été pour une 3x5 et de matrice de 10 répétitions. Différentes tailles de matrices peut donner différents ordres.EDIT:
Pour n=600, les résultats sont dans un ordre différent (en laissant l'explicite
rbind
version):donnant
Si vous incluez l'explicite
rbind
version, il est légèrement plus rapide que lado.call("rbind", rep(list(A), n))
version, mais pas de beaucoup, et plus lent que leapply
oumatrix
versions. Donc une généralisation arbitrairen
ne nécessite pas une perte de vitesse dans ce cas.rbind
appels pour les plus grands n, disons n = 600. Dans ce cas, la version avec lematrix(rep(t(...
-appel a été plus efficace.C'est probablement plus efficace:
A <- matrix(1:15, nrow=3);
n <- 2;
rbind(A,A);
matrix(rep(A, n), ncol = ncol(A), byrow = TRUE)
pas la même chose... edit: pourquoi ne puis-je pas créer des retours à la ligne (dans un commentaire?Il y a aussi cette façon:
A
est répétén
fois, puis il est tout simplement:A %x% rep(1, n)
.que de le transformer en un tableau, de répliquer le contenu et créer une nouvelle matrice avec la mise à jour du nombre de lignes?
Vous pouvez utiliser l'indexation