gpt4 book ai didi

arrays - 以数组作为输出的并行 `for` 循环

转载 作者:行者123 更新时间:2023-12-02 09:44:52 28 4
gpt4 key购买 nike

如何并行运行 for 循环(以便我可以使用 Windows 计算机上的所有处理器),结果为 3 维数组?我现在的代码需要大约一个小时才能运行,类似于:

guad = array(NA,c(1680,170,15))
for (r in 1:15)
{
name = paste("P:/......",r,".csv",sep="")
pp = read.table(name,sep=",",header=T)
#lots of stuff to calculate x (which is a matrix)
guad[,,r]= x #
}

我一直在查看相关问题,并认为我可以使用 foreach 但我找不到将矩阵组合成数组的方法。

我是并行编程的新手,因此非常感谢任何帮助!

最佳答案

您可以使用 abind 函数通过 foreach 来实现这一点。下面是一个使用 doParallel 包作为并行后端的示例,它相当可移植:

library(doParallel)
library(abind)
cl <- makePSOCKcluster(3)
registerDoParallel(cl)
acomb <- function(...) abind(..., along=3)
guad <- foreach(r=1:4, .combine='acomb', .multicombine=TRUE) %dopar% {
x <- matrix(rnorm(16), 4) # compute x somehow
x # return x as the task result
}

这使用了一个名为 acomb 的组合函数,该函数使用 abind 包中的 abind 函数将集群工作线程生成的矩阵组合成3 维数组。

在这种情况下,您还可以使用 cbind 组合结果,然后修改 dim 属性,将结果矩阵转换为 3 维数组:

guad <- foreach(r=1:4, .combine='cbind') %dopar% {
x <- matrix(rnorm(16), 4) # compute x somehow
x # return x as the task result
}
dim(guad) <- c(4,4,4)

使用abind非常有用,因为它可以通过多种方式组合矩阵和数组。另外,请注意,重置 dim 属性可能会导致矩阵重复,这对于大型数组可能会出现问题。

请注意,最好在脚本末尾使用 stopCluster(cl) 关闭集群。

关于arrays - 以数组作为输出的并行 `for` 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17570806/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com