2

私はパッケージparallelforeach()関数で最初の一歩を踏み出しています。したがって、この質問はかなりばかげています。だからここに私が満たしたい私の仕事があります:

  1. 関数をオブジェクトに適用するt
  2. 次の反復で結果を使用する

簡単な例は次のとおりです。

newFunc<-function(){
    test[i+1] <<- sqrt(test[i])
}

test <- c(1,rep(NA, 10))

foreach(i=1:11, .combine='rbind', .export='test')%do% newFunc()

これにより、もちろん for ループと同様に 1 のベクトルが生成されます。ただし、これを並列化しようとすると、別の結果が得られます。

test <- c(1,rep(NA, 10))

library(doParallel)
library(foreach)
cl <- makeCluster(4)
registerDoParallel(cl)

foreach(i=1:11, .combine='rbind', .export='test')%dopar% newFunc()

stopCluster(cl)

これにより、出力が残りますc(1, NA, NA, NA, NA, ..., NA)。これは、スレーブが他の関数の結果を知らないためだと思いますか? 必要な情報を提供できたと思います。私の実際の機能はもちろんもっと複雑ですが、この例は私の問題を示す最も簡単な方法のようです。

編集:最初の質問は次のとおりだと思います:そのような問題はまったく並列化できますか?

4

1 に答える 1

2

提起された反復が並行して実行されないのは事実ですが、

test = numeric(11); test[] = 2
test^(1/2^(0:10))

これは簡単に並列化できます (ただし、計算は既にベクトル化されているため不要です)。

fun = function(i, test)
    test[i] ^ (1 / 2^(i - 1))
unlist(mclapply(seq_along(test), fun, test))

並列評価でfunは、非ローカル変数を更新しないでください ( で行うように<<-)。元の定式化では逐次評価が必要なように見えても、実際の問題を並行して評価できる方法で提起できるのではないでしょうか?

于 2012-09-15T15:42:27.160 に答える