我尝试优化模拟脚本的各个部分,并使其中的一部分并行运行。所以我发现了foreach
函数。
作为一个例子,我尝试并行运行
Wiederholungen<-4
assign("A",array(0,c(Wiederholungen,10,3)))
assign("B",array(0,c(Wiederholungen,10,3)))
assign("C",array(0,c(Wiederholungen,10,3)))
旧代码:
for(m in 1:Wiederholungen){
A[m,,]<-m
B[m,,]<-m
C[m,,]<-m
}
导致:(对于A)
A
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3 3 3 3
[4,] 4 4 4 4 4 4 4 4 4 4
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3 3 3 3
[4,] 4 4 4 4 4 4 4 4 4 4
, , 3
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3 3 3 3
[4,] 4 4 4 4 4 4 4 4 4 4
这应该将m的值放在数据帧A,B & C
的第m行中。在我的脚本中,m是脚本应该运行的重复次数(Wiederholungen)。
Foreach代码:
foreach(m=1:Wiederholungen)%dopar%{
A[m,,]<-m
B[m,,]<-m
C[m,,]<-m
}
导致:
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
但这不会导致数据帧A,B,C
的上述结果。我知道foreach
有一个combine
选项,但是如果你有一个矩阵的结果而不是我的例子中的几个,那么似乎只能工作。如何使用并行处理方法获得与旧的for循环相同的结果。我使用的是Ubuntu和3.2.2。
答案 0 :(得分:0)
我知道这是一篇很老的帖子,但我认为答案可能会在未来对某人有所帮助。
Foreach 只返回在循环中创建的最后一个对象的列表。因此,如果您希望返回 A、B 和 C,则需要将它们列为循环的最后一步。 此代码适用于我。
W<- foreach(m = 1:Wiederholungen) %dopar% {
A[m,,]<-m
B[m,,]<-m
C[m,,]<-m
list(A, B, C)
}
为了将来参考,foreach 插图对此类事情非常有帮助。