Julia 从for循环收集元组数组

Julia 从for循环收集元组数组,julia,Julia,我有一些代码使用@parallel for循环进行计算,在每次迭代时生成一个输出元组。我想在数组中收集这些元组,以便进一步处理: n=2 out = @sync @parallel (hcat) for i=1:n (i, i+1) end for i=1:n (j,k) = out[i] # do something end println("okay") 如果这里只有循环的一次迭代,out是一个元组,而不是元组数组,(j,k)=out[i]抛出一个错误 n=1 ou

我有一些代码使用
@parallel for
循环进行计算,在每次迭代时生成一个输出元组。我想在数组中收集这些元组,以便进一步处理:

n=2
out = @sync @parallel (hcat) for i=1:n
    (i, i+1)
end
for i=1:n
    (j,k) = out[i]
    # do something
end
println("okay")
如果这里只有循环的一次迭代,
out
是一个元组,而不是元组数组,
(j,k)=out[i]
抛出一个错误

n=1
out = @sync @parallel (hcat) for i=1:n
    (i, i+1)
end
for i=1:n
    (j,k) = out[i] # error
    # do something
end
println("not reached")
是否有一种方法可以强制
out
成为元组数组,而不考虑
n
的值,而不必在循环后对
out
进行任何检查

谢谢。

因为
hcat(hcat(x))=hcat(x)
但始终是一个矩阵。你可以加上:

out = hcat(out)

在并行循环之后。但这看起来像是一种黑客行为。

当您在
元组…
上调用
hcat
时,您将被引导到更通用的算法:

julia> @which hcat((1,2))
hcat{T}(X::T...) at abstractarray.jl:710

julia> @which hcat([(1,2)])
hcat{T}(V::Array{T,1}...) at array.jl:690
Julia花更多的时间做hcat

julia> @time out = @sync @parallel (hcat) for i=1:10_000
           (i, i+1)
       end;
0.146527 seconds (4.67 k allocations: 508.905 KB)

julia> @time out = @sync @parallel (hcat) for i=1:10_000
           [(i, i+1)]
       end;
0.061976 seconds (4.76 k allocations: 513.370 KB)
此外,如果使用第二种语法,则在
n=1
时不会出现错误:

n=1
out = @sync @parallel (hcat) for i=1:n
    [(i, i+1)]
end
for i=1:n
    (j,k) = out[i] # OK
    # do something
end

@雷扎的回答是:用
[(i,i+1)]
取代
(i,i+1)
看起来更好。在任何情况下,在1个元素上并行循环都会带来一些开销。