【问题标题】:Nesting of foreach loops Rforeach循环的嵌套R
【发布时间】:2016-05-28 03:15:12
【问题描述】:

我有一个与此非常相似的代码:

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)
    }
}

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

谢谢。

【问题讨论】:

    标签: r foreach nested-loops parallel-foreach


    【解决方案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 个以上的起始矩阵),否则您不需要在计算下一个之前分别编写每个矩阵。在这种情况下,先将起始矩阵写入磁盘,然后再读取每个矩阵并进行处理可能是个好主意。

    这几乎是即时的,最大为 100x100,除了在最后一个映射中写入所有单独的阈值文件。并行化最有帮助。

    【讨论】:

    • 非常感谢!这很有帮助。我想我必须写很多东西,因为我正在使用四倍精度。走着瞧。但是再次感谢您!
    猜你喜欢
    • 2019-07-13
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2018-07-15
    • 2020-06-07
    相关资源
    最近更新 更多