【发布时间】:2016-01-26 16:37:09
【问题描述】:
我尝试优化模拟脚本的某些部分并使其部分并行运行。所以我发现了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。
【问题讨论】:
-
显示的不是A、B、C的值。输入
A你就会得到你想要的 -
如果我输入 A,它会打印出矩阵 A,只有在第一步中分配的零。
-
我没有这个,这个作业对我很有效。你的包/R 版本是最新的吗?
-
我使用的是 R 版本 3.2 和 foreach 1.4.2。我没有看到 foreach 将数据写入矩阵。
-
这不是
foreach循环的工作方式。你应该研究这些小插曲。简而言之,返回每次迭代的结果(就像使用函数一样)并使用传递给.combine的函数或在后续步骤中组合结果。
标签: r foreach parallel-processing parallel-foreach