2016-06-27 7 views
0

相続人は私の問題を示すサンプルコード:入れ子のforループをRのif文と並列化する方法は?

for(i in 1:100) { 
    for(j in 1:100) 
    { 
     if (A[i] < A[j]) { 
      tempMatrix[i, j] <- foo(val_1[i], val_2[j]) 
     } else { 
      tempMatrix[i, j] <- foo(val_2[j], val_1[i]) 
     } 
    } 
} 

上記のコード部分は計算に時間がかかりすぎる、上記を並列化する方法はありますか?それはそれ自体で40%のスピードアップを取得するようifelseを使用して

val_1、val_2、およびAについての50K要素

+0

'plyr'パッケージを見ると、構文は標準の' apply'ファミリの関数を使うよりも簡単です。 – zacdav

+0

並列の 'for'ループでデッドセットが発生した場合は、' foreach'パッケージを見てください。外部ループをパラレル適用関数に置き換えることもできます。それらの詳細については、 'parallel'パッケージを参照してください。 – lmo

+2

あなたの質問を再現できるようにサンプルデータをご提供ください。たとえば、 'A'、' val_1'、 'val_2'のそれぞれに10個の値を与えます。また、 'foo'ではなく何か。 「最小」、「最大」、または「平均」が適切であろうか? – bdemarest

答えて

0

基本ベクトルのベクトルではと思われる:

n <- 300 
A <- rnorm(n) 
val_1 <- rpois(n, 10) 
val_2 <- rpois(n, 20) 
tempMatrix <- matrix(NA, n, n) 
tempMatrix2 <- matrix(NA, n, n) 


foo <- function(i, j) if(i %% j == 0) 5 else i 


microbenchmark(times=30, orig= 
for(i in 1:n) { 
    for(j in 1:n) 
    { 
     if (A[i] < A[j]) { 
      tempMatrix[i, j] <- foo(val_1[i], val_2[j]) 
     } else { 
      tempMatrix[i, j] <- foo(val_2[j], val_1[i]) 
     } 
    } 
} 
,mapp= 
for(j in 1:n) { 
    w <- A < A[j] 
    x <- ifelse(w, val_1, val_2[j]) 
    y <- ifelse(w, val_2[j], val_1) 
    tempMatrix2[,j] = mapply(foo, x, y) 
} 
) 
all.equal(tempMatrix, tempMatrix2) 

収量:

Unit: milliseconds 
expr  min   lq  mean  median   uq  max neval 
orig 187.449344 191.274325 195.7138641 192.635209 196.705712 220.292461 30 
mapp 116.479130 117.531128 121.5658793 118.779243 123.359916 147.540282 30 

nを400にすると、収率は:

Unit: milliseconds 
expr  min   lq  mean  median   uq  max neval 
orig 338.356754 341.815807 351.2388823 345.4547705 357.107122 382.312691 30 
mapp 203.892420 206.377714 209.9775747 208.6823080 210.757181 239.354271 30 
関連する問題