r - 在 R 中使用 doParallel 嵌套 foreach 循环
问题描述
我在下面有一个嵌套的 for 循环(它做的不多,但它是我想做的事情的一个更简单的版本)。我想并行化这个计算。
x=seq(-4,4,length.out=1000)
y1 = pnorm(x)
y2 = pnorm(x, mean = 2)
y3 = pnorm(x, mean = 2.1)
y4 = pnorm(x, mean = 2.2)
y5 = pnorm(x, mean = 2.3)
y6 = pnorm(x, mean = 2.4)
y7 = pnorm(x, mean = 2.5)
y8 = pnorm(x, mean = 2.6)
A = matrix(c(y1,y2),nrow = 2, byrow =TRUE)
B = array(c(y3,y4,y5,y6,y7,y8), dim = c(1000,3,2))
tt = 1:1000
BB = 3
set.seed(1)
BBB = runif(BB)
res=matrix(0,nrow=2,ncol=2)
width = double(2)
for(i in 1:2){
Ai=A[i,]
Bi=B[,,i]
C = approx(Ai, tt, BBB)$y
D=double(BB)
for(j in 1:3){
D[j]=approx(tt, Bi[,j], C[j])$y
}
alphastar=quantile(D,c(0.1/2,1-0.1/2))
res[i,]=approx(Ai, tt, alphastar)$y
width[i] = diff(res[i,])
}
有一些类似的问题Q1和Q2,但他们没有回答我的问题。总之,我的计算有以下形式
for(i in 1:2){
code involving only i subscript
for(j in 1:3){
code which uses output from above
}
code involving output from j loop
}
是否可以通过使用 foreach 以这种方式嵌套 for 循环?我希望这段代码返回 res (一个矩阵)和 width (一个向量)。
编辑:Q1包含一个有趣的例子:
x <- foreach(i=1:8, .combine='rbind') %:%
foreach(j=1:2, .combine='c') %dopar% {
l <- runif(1, i, 100)
i + j + l
}
但是,我不想l <- runif(1, i, 100)
为每个 j 运行(在这个例子中)。对于每个 i,它只需要运行一次。在两个循环中运行所有内容会浪费大量时间(在本示例中可能不会,但在其他示例中会)。是否有可能获得某种形式的东西
x <- foreach(i=1:8, .combine='rbind') %:%
l <- runif(1, i, 100)
foreach(j=1:2, .combine='c') %dopar% {
i + j + l
}
上面的代码不起作用。有什么方法可以修改上面的内容,以允许在第一个循环中计算不涉及 j 的代码,而不是浪费时间为每个 j 运行它?
解决方案
看看这个 。关于嵌套 foreach() 的类似问题已通过一些示例进行了回答。
推荐阅读
- postgresql - 从 Aqueduct 应用程序获取上次修改日期时间的最轻量级方法是什么?
- datetime - 为每个请求指定 TimeZone
- mysql - 数据库错误 PDOException 错误:SQLSTATE[HY000] [1045]
- android - 如何将应用程序安装到 Android 模拟器的 SD 卡而不是其内部存储器?
- javascript - 如何在Javascript上为计时器制作暂停/播放按钮?
- mysql - 在插入错误语法#1064 后选择 count(*) 并选择 sum(my_data)
- python - 如何使用多处理添加大量 pandas df
- c# - 无法使用 WorkItemTrackingHttpClient 更新 WorkItem 状态
- python - Python双重列表到文本文件
- rabbitmq - RabbitMQ Pika - 如何检查消费者是否处于活动状态