2012-09-15 35 views
2

我只是採取我的第一步與包parallelforeach()函數。因此這個問題會比較愚蠢。所以這裏是我的任務,我想fullfil:取決於以前的結果並行化for循環

  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循環當然也是。不過,如果我嘗試parallelise這這會產生不同的結果:

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)。我猜想這是因爲奴隸不知道其他功能的結果?我希望我提供了必要的信息。我的實際功能當然更復雜,但這個例子似乎是證明我的問題最簡單的方法。

編輯:我想第一個問題是:這樣的問題可以並行嗎?

+0

我不明白。如果迭代的每一步取決於前一步,則不能並行執行。 – Roland

+0

好吧我猜這已經回答了我的問題!謝謝 – Seb

回答

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不應該更新一個非本地變量(如你<<-做)。也許你真正的問題可以通過一種方式來提出,即使原始公式似乎需要連續評估,也可以並行評估它們。