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
4

1 回答 1

1

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

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

顺便说一句,循环中的任何变量for都将自动导出到从处理器,因此在您的示例中,矩阵ab并且cc可以在%dopar%.

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

foreach可以在此处找到另一个示例。


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

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

这里的一个例子。

于 2016-09-29T07:03:06.173 回答