2013-04-18 15 views
7

です。列数が少なく行が多い行列の各行を並べ替えることを試みています。このベクトル化されたバージョンがRにありますか?ベクトル化の順番はR

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

、でしょうexample.matrixを注文するには

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

、私しかし、それは非常に遅いですし、私はより速く何かを大好きだ:具体的には、のは、10に私たちのシードを設定し、例えば、行列を作ってみよう。類推として 、

rowSums(example.matrix) 

がはるかに理解

apply(example.matrix,1,sum) 

、ことが好ましいです。

+0

私のために8秒かかり、私はそれは非常に遅いとは思わない:) –

+0

右。それは私が持っているものより小さなサイズのおもちゃの例でした。私はこれを何度もやる必要があります。 –

+0

私はそれを理解していますが、そのポイントは残っています。速度を最適化するためのいくつかのオプションがあります(例:並列コンピューティングを使用してC++でコードを記述します。 –

答えて

3

はここで10倍にそれを高速化する方法です。これは具体的にあなたの例に合わせたもので、実際のデータが何であるかによって、この方法はうまく動作しないかもしれません。

アイデアは第二に、最初の行、1に0を追加しように、次にソートこと、次いで、マトリックスに再結合し、ベクターにそれを崩壊することである。

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

これは(キービットが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