我正在尝试使用从不同分布中抽取的参数值进行多次模拟。我想将每列运行的结果保存到不同的矩阵中。这应该是相当常见的但我很难将原始脚本与嵌套循环并行化。我想知道我是否能在这里找到一些帮助。
这是我尝试并行化的方法:
library(foreach)
library(doParallel)
library(raster)
cl <- makeCluster(5)
registerDoParallel(cl)
ccomb <- function(...) {
args <- list(...)
lapply(seq_along(args[[1]]), function(i)
do.call('cbind', lapply(args, function(a) a[[i]])))}
sim.results<-foreach(i=1:n.iter, .combine='ccomb', .multicombine=TRUE,.packages =c("raster")) %dopar% {
for(k in 1:n.year) {
temp.s1<-matrix.s1[,k]*matrix.pro[,k]
temp.raster<-raster(nrow=10, ncol=10,xmn=0, xmx=10,ymn=0, ymx=10,crs=NA,resolution=c(1,1))
temp.raster[]<-temp.s1
temp.raster.mv<-focal(temp.raster,w=matrix.mv,fun=sum,na.rm=T)
post.mv<-as.vector(temp.raster.mv)
matrix.s1[,k+1]<-post.mv+matrix.s2[,k]
matrix.s2[,k+1]<-matrix.s2[,k]*matrix.pro[,k]}
matrix.s1_year2<-matrix.s1[,2]
matrix.s1_year3<-matrix.s1[,3]
matrix.s1_year4<-matrix.s1[,4]
matrix.s2_year2<-matrix.s2[,2]
matrix.s2_year3<-matrix.s2[,3]
matrix.s2_year4<-matrix.s2[,4]
list(matrix.s1_year2,matrix.s1_year3,matrix.s1_year4,matrix.s2_year2,matrix.s2_year3,matrix.s2_year4)}
stopCluster(cl)
内部for(k in 1:n.year)
循环是顺序的(每年的计算取决于前一年的结果)并包含一个移动窗口函数,因此我认为它必须保持整体。外foreach
循环是我想运行内循环的次数,我想在外循环结束时保存六个矩阵中的所有运行。
然而,当我运行上面的代码时,我发现它只使用了一个核心并且没有加速。如果我理解this post正确,那么在for
循环中放置foreach
循环应该没问题。
我想知道是否有人可以帮我找到问题所在?非常感谢!
更新
以下是示例数据:
n.year<-3
n.iter<-5
matrix.s1<-matrix(NA,100,n.year+1,dimnames= list(NULL,c("year1","year2","year3","year4")))
matrix.s2<-matrix(NA,100,n.year+1,dimnames= list(NULL,c("year1","year2","year3","year4")))
matrix.pro<-matrix(rbeta(300,1,1),100,n.year,dimnames= list(NULL,c("year1","year2","year3")))
matrix.mv<-matrix(rbeta(25,1,1),5,5)
matrix.s1_year2<-matrix.s1_year3<-matrix.s1_year4<-matrix(NA,100,n.iter)
matrix.s2_year2<-matrix.s2_year3<-matrix.s2_year4<-matrix(NA,100,n.iter)
matrix.s1[,1]<-runif(100,0,10)
matrix.s2[,1]<-runif(100,10,20)