在R中如何在运行并行时为foreach()函数定义一个组合函数

时间:2016-09-28 14:25:30

标签: r foreach parallel-foreach

我想进行排列测试,这是代码的结构(带有虚拟数据)。排列将并行运行,并希望计算生成的矩阵未通过测试的次数。 (见代码区块2)。但是在块2中这很慢,因为它在单个处理器中工作。我想写一个.combine函数来使用foreach()函数,但我不知道如何给出输入参数(cc和矩阵)

library(foreach)
library(parallel)

#matrix to be populated
cc<-matrix(0,nrow = 10,ncol = 10)

#fixed matrix
a<-matrix(runif(100), ncol=10)

iters<-1e3
cl<-makeCluster(8)
registerDoParallel(cl)


ls<-foreach(icount(iters)) %dopar% {
#generated matrix
  b<-matrix(runif(100), ncol=10)
  b
 }


stopCluster(cl)

这部分是问题所在。我想计算矩阵b的每个元素大于固定矩阵a的次数,并将每个元素的计数添加到cc矩阵。如果我可以定义.combine函数,则应在生成每个矩阵时执行。

for(b in ls){
  for(i in 1:dim(a)[1]) {
    for(j in 1:dim(a)[2]) {
      if(a[i,j] < b[i,j]) cc[i,j]=cc[i,j] + 1

     }
   }
}

cc

1 个答案:

答案 0 :(得分:1)

关于“我不知道如何给出输入参数(cc和矩阵)”

我认为.export可以解决您提到的问题。

BTW,for循环中的任何变量都将自动导出到从属处理器,因此在您的示例中,矩阵abcc可以作为%dopar%下的序列号。

  

.EXPORT
  要导出的变量的字符向量。这可能很有用   访问当前未定义的变量时   环境。默认值为NULL。

foreach的另一个例子可以在here中找到。

关于,“如果我可以定义.combine函数,则应该在生成每个矩阵时执行。”

是的,您可以将函数定义为普通R函数并传递给.combine=your_func,这将在从属进程返回后调用。

here中的示例。