【问题标题】:Parallel foreach with two arguments具有两个参数的并行 foreach
【发布时间】:2015-09-30 04:29:07
【问题描述】:

我有这个代码:

  library(doParallel)
    registerDoParallel(cores = 8)

    result = foreach(A = c(1, 2, 3),B = c(10, 20), .combine = list) %dopar% {
    A*B
}

结果

[[1]]
[1] 10

[[2]]
[1] 40

但我想要: 10、20、30、20、40、60

【问题讨论】:

  • foreach(A = c(1, 2, 3))%:%foreach(B = c(10, 20), .combine = cbind)%dopar%{A*B}
  • 作为旁注,我来到这里试图找出有一个 foreach 循环,其中一个循环依赖于第一个循环,这样外部循环就不必等待内循环完成。 @Khashaa 的构造适用于此,如图所示:foreach(A = c(1, 2, 3))%:%foreach(B = c(A, 20), .combine = cbind)%dopar%{c(A,B)}

标签: r foreach doparallel


【解决方案1】:

AB 中的值是并行推进的迭代器。这不是嵌套循环。在这样的foreach 构造中,在每次迭代之后,序列A 的下一个值序列B 的下一个值被选择,直到任何一个序列的结尾是到达。一个不是特别优雅的解决方法是按顺序显着增加序列AB 的大小,如下所示:

library(doParallel)
registerDoParallel(cores = 8)
result <- foreach( A =rep(c(1,2,3),2), B = rep(c(10, 20), each=3), 
                  .combine='cbind') %dopar% { A*B }
#> result
#     result.1 result.2 result.3 result.4 result.5 result.6
#[1,]       10       20       30       20       40       60

当然有更好的方法来解决问题,但这可能有助于说明您获得意外结果的原因。无论如何,我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 2013-02-01
    • 1970-01-01
    • 2020-05-10
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多