嵌套foreach循环R.

时间:2016-02-16 17:39:05

标签: r foreach nested-loops parallel-foreach

我有一个非常类似的代码:

for(i in 1:5){
    mat<-matrix(runif(i^2,0,1), nrow=i, ncol=i)
    mat.max<-round(max(mat), 2)
    mat.min<-round(min(mat), 2)
    mat.tresh.seq<-seq(mat.min, mat.max, 0.01)
    dir.loc<-paste('~/', i, '/', sep='')
    dir.create(dir.loc, recursive=TRUE)
    mat.name<-paste(dir.loc, 'og-mat.csv', sep='')
    write.csv(mat, mat.name)
    dir.loc.2<-paste(dir.loc, 'treshhold/', sep='')
    dir.create(dir.loc.2, recursive=TRUE)
    for(j in mat.tresh.seq){
        mat.tresh <- mat>=j
        mat.tresh[mat.tresh == TRUE] <- 1
        mat.tresh[mat.tresh == FALSE] <- 0
        mat.tresh.name<-paste(dir.loc.2, 'thresh mat ', j, '.csv', sep='')
        write.csv(mat.tresh, mat.tresh.name)
    }
}

每个随机矩阵可以彼此独立地生成,并且每个阈值矩阵可以彼此独立地生成,但是阈值矩阵取决于随机矩阵。我将如何为这样的代码进行嵌套并行化?我必须只选择一个循环并行吗?

感谢。

1 个答案:

答案 0 :(得分:1)

我倾向于不混合数据处理和保存数据。如果将这些和两种类型的矩阵分开,那么您可以使用各种选项来运行并行函数。所以我对嵌套循环问题的回答,其中内部依赖于外部,但在其他方面是独立的,将是不必要的。

# starting matrices
og <- lapply(1:100,function(i){
  matrix(runif(i^2,0,1), nrow=i, ncol=i)
})

# threshhold matrices
y <- lapply(og,function(x){
  mat.tresh.seq <- seq(round(min(x), 2), round(max(x), 2), 0.01)
  z <- lapply(mat.tresh.seq,function(y,mat){
    mat.tresh <- mat>=y
    mat.tresh * 1
  },mat = x)
  names(z) <- mat.tresh.seq
  z
})

# directory/file structure
ynames <- lapply(y,names)

# create all folders
lapply(paste0('~/',1:length(ynames),'/threshhold'),dir.create,recursive = T)

# write og files
mapply(FUN = function(mainfolder,ogfiles){
  filename <- paste('~/',mainfolder, '/og-mat.csv', sep='')
  write.csv(ogfiles,filename)
},mainfolder = 1:length(og),ogfiles = og)

# write threshhold files
mapply(mainfolder = 1:length(ynames),filenames = ynames,FUN = function(mainfolder,filenames,ydata){
  lapply(filenames,function(x){
    filename <- paste('~/',mainfolder, '/threshhold/thresh mat ', x, '.csv', sep='')
    write.csv(ydata[[mainfolder]][[x]],filename)
  })
},MoreArgs = list(ydata = y))

每个* apply函数都可以是并行版本(如果你在Windows上,则为mapply的clusterMAP)。除非内存是一个问题(我的计算机上超过大约100个起始矩阵),否则在计算下一个之前你不需要单独写每个。在这种情况下,首先将起始矩阵写入磁盘,然后读取每个矩阵并进行处理可能是一个好主意。

除了在最后一个mapply中写入所有单个阈值文件之外,这几乎是最近的100x100。并行化将有助于最大化。