foreach循环的嵌套R
Nesting of foreach loops R
我有一个与此非常相似的代码:
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)
}
}
每个随机矩阵可以彼此独立生成,每个阈值矩阵可以彼此独立生成,但阈值矩阵依赖于随机矩阵。我将如何为这样的代码进行嵌套并行化?必须只选择一个循环并行吗?
谢谢。
我倾向于不混合数据处理和保存数据。如果您将这些和两种类型的矩阵分开,那么您可以选择 运行 并行函数的各种选项。因此,对于内部依赖于外部但在其他方面独立的嵌套循环的问题,我的回答是取消嵌套。
# 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 的瞬间。并行化最有帮助。
我有一个与此非常相似的代码:
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)
}
}
每个随机矩阵可以彼此独立生成,每个阈值矩阵可以彼此独立生成,但阈值矩阵依赖于随机矩阵。我将如何为这样的代码进行嵌套并行化?必须只选择一个循环并行吗?
谢谢。
我倾向于不混合数据处理和保存数据。如果您将这些和两种类型的矩阵分开,那么您可以选择 运行 并行函数的各种选项。因此,对于内部依赖于外部但在其他方面独立的嵌套循环的问题,我的回答是取消嵌套。
# 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 的瞬间。并行化最有帮助。