我想进行排列测试,这是代码的结构(带有虚拟数据) . 排列将并行运行,并且想要计算生成的矩阵未通过测试的次数 . (见代码区块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 回答
关于,“我不知道如何给出输入参数(cc和矩阵)”
我认为
.export
可以解决您提到的文件问题 .顺便说一句,
for
循环中的任何变量都将自动导出到从处理器,因此在您的示例中,矩阵a
,b
和cc
可以作为%dopar%
下的串行代码运行 .foreach
的另一个例子可以在here中找到 .关于,“如果我可以定义一个.combine函数,这应该在生成每个矩阵时执行 . ”
是的,您可以将函数定义为普通R函数并传递给
.combine=your_func
,这将在从属进程返回后调用 .here中的一个例子 .