4

如何for并行运行一个循环(这样我就可以使用我的 Windows 机器上的所有处理器),结果是一个 3 维数组?我现在运行的代码大约需要一个小时,类似于:

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,但我找不到将矩阵组合成数组的方法。

我是并行编程的新手,所以非常感谢任何帮助!

4

1 回答 1

12

您可以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
}

这使用了一个名为 combine 的函数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).

于 2013-07-10T13:35:21.183 回答