2013-07-10 37 views
4

如何在並行運行for循環(因此我可以使用Windows機器上的所有處理器),結果是3維數組?我現在有代碼需要大約一個小時運行,是一樣的東西:具有陣列作爲輸出的並行`for`循環

guad = array(NA,c(1680,170,15)) 
for (r in 1:15) 
{ 
    name = paste("P:/......",r,".csv",sep="") 
    pp = read.table(name,sep=",",header=T) 
    #lots of stuff to calculate x (which is a matrix) 
    guad[,,r]= x # 
} 

我一直在尋找相關的問題,我想我可以使用foreach,但我無法找到一個方法來矩陣組合成一個陣列。

我是新來的並行編程,所以任何幫助將非常感激!

+1

看看'foreach'的'.combine'參數。你不需要預先爲'foreach'分配'guad',每次迭代只返回一個矩陣。所有的矩陣可以通過'foreach'組合成一個數組。研究幫助頁面和包裝小插曲。 – Roland

+0

我看過'.combine',但它只允許c,cbind,rbind或函數,所以如何將矩陣組合到一個數組中? – sbg

+0

通過將[函數](http://stackoverflow.com/q/15213463/1412059)傳遞給'.combine'來將矩陣綁定到數組中? – Roland

回答

8

你可以用foreach使用abind函數來做到這一點。下面是一個使用doParallel包作爲平行後端其中一個例子是相當便攜式:

library(doParallel) 
library(abind) 
cl <- makePSOCKcluster(3) 
registerDoParallel(cl) 
acomb <- function(...) abind(..., along=3) 
guad <- foreach(r=1:4, .combine='acomb', .multicombine=TRUE) %dopar% { 
    x <- matrix(rnorm(16), 4) # compute x somehow 
    x # return x as the task result 
} 

這使用稱爲acomb一個組合功能使用該abind函數從abind包到集羣工人產生成的矩陣合併3維陣列。

在這種情況下,也可以使用cbind結合的結果,並然後修改dim屬性之後向所得矩陣轉換成3維陣列:因爲它可以

guad <- foreach(r=1:4, .combine='cbind') %dopar% { 
    x <- matrix(rnorm(16), 4) # compute x somehow 
    x # return x as the task result 
} 
dim(guad) <- c(4,4,4) 

採用abind是有用以各種方式組合矩陣和陣列。此外,請注意重置dim屬性可能會導致矩陣重複,這可能是大型陣列的問題。

請注意,在腳本末尾使用stopCluster(cl)關閉羣集是個好主意。

+0

感謝您的幫助!我用你的第一個例子,它似乎工作:) – sbg