首页 文章

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

提问于
浏览
0

我想进行排列测试,这是代码的结构(带有虚拟数据) . 排列将并行运行,并且想要计算生成的矩阵未通过测试的次数 . (见代码区块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 回答

  • 1

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

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

    顺便说一句, for 循环中的任何变量都将自动导出到从处理器,因此在您的示例中,矩阵 abcc 可以作为 %dopar% 下的串行代码运行 .

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

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


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

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

    here中的一个例子 .

相关问题