Effizient replizieren Matrizen in R
Ich habe eine matrix und suchen nach einer effizienten Art und Weise zu replizieren, n-mal (wobei n die Anzahl der Beobachtungen im Datensatz). Zum Beispiel, wenn ich eine matrix A
A <- matrix(1:15, nrow=3)
dann will ich eine Ausgabe der form
rbind(A, A, A, ...) #n times
.
Offensichtlich gibt es viele Möglichkeiten, zu konstruieren, eine so große matrix, zum Beispiel mit Hilfe eines for
Schleife oder apply
oder ähnliche Funktionen. Jedoch der Aufruf an die "matrix-replication-Funktion" findet in der Kern meiner Optimierungs-Algorithmus, wo es heißt Zehntausende von malen während einer Ausführung meines Programms. Daher, Schleifen anwenden-Typ-Funktionen und ähnliches, sind nicht effizient genug. (Eine solche Lösung würde im Grunde bedeuten, dass ein loop über n wird durchgeführt, Zehntausende von Zeiten, das ist natürlich ineffizient.) Ich habe bereits versucht, den normalen rep
Funktion, aber noch nicht einen Weg gefunden, wie ordnen Sie die Leistung von rep
in eine matrix der gewünschten Form.
Die Lösung
do.call("rbind", replicate(n, A, simplify=F))
ist auch zu ineffizient, weil rbind
ist zu oft verwendet in diesem Fall. (Dann werden etwa 30% der gesamten Laufzeit meines Programms aufgewendet wird, die rbinds.)
Weiß jemand eine bessere Lösung?
rbind
ist nur einmal benutzt in der do.call
Weg. es ist die Replikation, die wahrscheinlich bogging it down.Getestet habe ich es mit
Rprof
und rbind
dauerte etwa doppelt so viel Zeit wie replicate
. Ich war auch überrascht.InformationsquelleAutor Wolfgang Pößnecker | 2012-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei weitere Lösungen:
Die erste ist eine Abwandlung des Beispiel in der Frage
Das zweite bezieht sich abrollen der matrix, die sich replizieren, und wiederzusammensetzen.
Da der Wirkungsgrad ist, was angefordert wurde, benchmarking notwendig ist
gibt:
Also die Schnellste ist die raw -
rbind
nennen, aber das setzt Vorausn
ist fest und bekannt Voraus. Wennn
ist nicht behoben, dann der Schnellste istdo.call("rbind", rep(list(A), n)
. Diese wurden für eine 3x5-matrix und 10 Replikationen. Verschieden große Matrizen geben könnten unterschiedlicher reihenfolbg.EDIT:
Für n=600, die Ergebnisse sind in einer anderen Reihenfolge (ohne die explizite
rbind
version):geben
Wenn Sie die ausdrückliche
rbind
version, es ist etwas schneller als diedo.call("rbind", rep(list(A), n))
version, aber nicht viel, und langsamer als dieapply
odermatrix
Versionen. So eine Verallgemeinerung auf beliebigen
nicht erforderlich, ein Verlust der Geschwindigkeit in diesem Fall.rbind
Anrufe für größere n, sagen wir n = 600. In diesem Fall, die version mit dermatrix(rep(t(...
-Aufruf war höchst effizient.InformationsquelleAutor Brian Diggs
Wahrscheinlich ist dies effizienter:
A <- matrix(1:15, nrow=3);
n <- 2;
rbind(A,A);
matrix(rep(A, n), ncol = ncol(A), byrow = TRUE)
nicht das gleiche... edit: warum kann ich nicht erstellen, die Zeilenumbrüche in einem Kommentar?Sorry, mein Fehler. Siehe das update meiner Antwort.
Danke, das ist schon eine Verbesserung. Ich bin noch auf der Suche, um noch schneller zu Lösungen, wenn. 😉
InformationsquelleAutor Sven Hohenstein
Gibt es auch auf diese Weise:
A
wiederholtn
mal dann ist es einfach:A %x% rep(1, n)
.InformationsquelleAutor stofer
was über die Umwandlung in ein array, den Inhalt replizieren und erstellen Sie eine neue matrix mit der aktualisierten Anzahl der Zeilen?
InformationsquelleAutor Valentin Ruano
Können Sie die Indizierung
InformationsquelleAutor konvas