2013-04-18 21 views
7

Ich versuche, jede Zeile in einer Matrix mit wenigen Spalten und vielen Zeilen zu bestellen. Gibt es eine vektorisierte Version davon in R? Genauer gesagt, wollen wir unsere Samen auf 10 gesetzt und ein Beispiel Matrix machen:Vektorisieren Reihenfolge in R

set.seed(10) 
example.matrix = replicate(12,runif(500000)) 

example.matrix Um zu bestellen, würde ich,

ordered.example = apply(example.matrix,1,order) 

Aber das ist sehr langsam und ich würde etwas schneller lieben. Als Analogie

rowSums(example.matrix) 

vorzuziehen,

apply(example.matrix,1,sum) 

sehr geschätzt.

+0

dauert 8 Sekunden für mich, I würde nicht sagen, dass es sehr langsam ist :) –

+0

Richtig. Das war ein Spielzeugbeispiel von geringerer Größe als das, was ich habe, und ich muss das oft machen. –

+0

Ich verstehe das, aber der Punkt bleibt. Es gibt mehrere andere Optionen, um die Geschwindigkeit zu optimieren, z. Schreiben des Codes in C++ mit paralleler Berechnung. Sie können einen besseren Effekt ergeben. –

Antwort

3

Hier ist ein Weg, um es zu beschleunigen 10x auf. Es ist speziell auf Ihr Beispiel zugeschnitten und abhängig davon, wie Ihre realen Daten sind, kann diese Methode funktionieren oder nicht.

Die Idee ist, 0 bis erste Zeile hinzuzufügen, 1 Sekunde und so weiter, dann ist es, einen Vektor, kollabieren sortieren, und dann in eine Matrix rekombinieren:

N = 12; M = 500000; d = replicate(N,runif(M)) 

system.time(d1<-t(apply(d, 1, order))) 
# user system elapsed 
# 11.26 0.06 11.34 

system.time(d2<-matrix(order(as.vector(t(matrix(as.vector(d) + 0:(M-1), nrow = M)))) - 
         rep(0:(M-1), each = N)*N, nrow = M, byrow = T)) 
# user system elapsed 
# 1.39 0.14 1.53 

# Note: for some reason identical() fails, but the two are in fact the same 
sum(abs(d1-d2)) 
# 0 
3

Dieses etwas schneller ist (der Schlüssel Bit ist order(row(em), em)):

set.seed(10) 
em <- replicate(12,runif(500000)) 
system.time(a <- matrix(em[order(row(em), em)], nrow=nrow(em), byrow=TRUE)) 
# user system elapsed 
# 5.36 0.12 5.80 

set.seed(10) 
example.matrix <- replicate(12,runif(500000)) 
system.time(ordered.example <- apply(example.matrix,1,order)) 
# user system elapsed 
# 13.36 0.09 15.52 

identical(a, ordered.example) 
# [1] FALSE 
Verwandte Themen