2013-01-23 22 views
9

私はこのように、カスタム関数を定義している:1000行と20列により構成される出力行列、outputを返し)(使用したユーザ定義関数を繰り返し複製()またはsapply

my.fun = function() { 

     for (i in 1:1000) { 
     ... 
     for (j in 1:20) { 
      ... 
     } 
     } 

return(output) 

} 

。コード明確を作るためのforループ別を使用せずに、私がする必要がどのような

機能を繰り返すことである5回を言うと、ブランドの新しい行列に5つのoutput結果を格納するために、final言うが、(これ、また2番目の瞬間に、これらの5つの追加の繰り返しを並列化しようとしているからです)。

したがって、finalは、5000行と20列の行列でなければなりません(これらの5つの繰り返しの背後にある理論的根拠は、私が使用する2つのforループ内のものです)。sampleです。

5つの複製を正しく計算するfinal <- replicate(5, my.fun())を使用しようとしましたが、次に新しい「5000 x 20」マトリックスに「手動で」要素を配置する必要があります。 (おそらくsapply()を使用していますか?)多くのおかげで

答えて

11

おそらく3次元の配列があります。リストを作成したい場合は、simplify = FALSEを追加します。

do.call(rbind, replicate(5, my.fun(), simplify=FALSE)) 

それとも、「最終的には」まだ配列である場合にはapermを使用することができます:

fun <- function() matrix(1:10, 2,5) 
final <- replicate(2, fun()) 
> final 
, , 1 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 

, , 2 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 

> t(matrix(aperm(final, c(2,1,3)), 5,4)) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 
[3,] 1 3 5 7 9 
[4,] 2 4 6 8 10 

より経済的な行列演算がある場合があり、これを試してみてください。私はちょうどまだ1つを発見していない。

+0

多くのご協力ありがとうございます。ちなみに、3次元配列については、あなたは正しかった:) – Stezzo

7

あなたはplyrパッケージからrlplyreplicateを交換する場合は、使用することができますdo.callrbindと:あなたはむしろplyrパッケージに依存したくない場合

library(plyr) 
do.call(rbind, rlply(5, my.fun())) 

、いつでも行うことができます。

do.call(rbind, lapply(1:5, function(i) my.fun())) 
7

並列計算に使用するパッケージによって異なりますが、これはどのようにして行うのですか(sapplyをループとして非表示にします(replicateのように)。

library(snowfall) 
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") 
# sfExport() #export appropriate objects that will be needed inside a function, if applicable 
# sfLibrary() #call to any special library 
out <- sfSapply(1:5, fun = my.fun, simplify = FALSE) 
sfStop() 
+0

ありがとう、これは非常に興味深いです、そして、私は 'snowfall'を使う予定でした。 – Stezzo

0

これを試してみてください:

final <- replicate(5, my.fun(), simplify = "matrix") 

あなたは行列の形で '最終' の結果を取得します。

関連する問題