在 R 中如何在 运行 并行时为 foreach() 函数定义组合函数
In R how to define a combine function for foreach() function when running parallel
我想做一个排列测试,这是代码的结构(带有虚拟数据)。排列将 运行 并行,并希望计算生成的矩阵未通过测试的次数。 (参见代码块 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
关于,"I don't know how to give the input parameters(cc and a matrices)"
我认为 .export
可以像文档中提到的那样解决您的问题。
顺便说一句,for
循环中的任何变量都将自动导出到从属处理器,因此在您的示例中,矩阵 a
、b
和 cc
可以是在 %dopar%
.
下作为串行代码运行
.export
character vector of variables to export. This can be useful
when accessing a variable that isn't defined in the current
environment. The default value in NULL.
foreach
的另一个例子可以在 here 中找到。
关于,"If i can define a .combine function this should execute when each matrix is generated."
是的,您可以将函数定义为普通 R 函数并传递给 .combine=your_func
,它将在从属进程返回后调用。
here.
中的示例
我想做一个排列测试,这是代码的结构(带有虚拟数据)。排列将 运行 并行,并希望计算生成的矩阵未通过测试的次数。 (参见代码块 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
关于,"I don't know how to give the input parameters(cc and a matrices)"
我认为 .export
可以像文档中提到的那样解决您的问题。
顺便说一句,for
循环中的任何变量都将自动导出到从属处理器,因此在您的示例中,矩阵 a
、b
和 cc
可以是在 %dopar%
.
.export
character vector of variables to export. This can be useful when accessing a variable that isn't defined in the current environment. The default value in NULL.
foreach
的另一个例子可以在 here 中找到。
关于,"If i can define a .combine function this should execute when each matrix is generated."
是的,您可以将函数定义为普通 R 函数并传递给 .combine=your_func
,它将在从属进程返回后调用。
here.
中的示例