在foreach循环中运行for循环

时间:2018-04-09 20:50:17

标签: r foreach parallel-processing doparallel

我正在尝试使用从不同分布中抽取的参数值进行多次模拟。我想将每列运行的结果保存到不同的矩阵中。这应该是相当常见的但我很难将原始脚本与嵌套循环并行化。我想知道我是否能在这里找到一些帮助。

这是我尝试并行化的方法:

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)  

0 个答案:

没有答案