让我们说我有一个名为trig的函数,它返回两个输出:
function trig(x)
return(sin(x), cos(x))
end
如果我想在很多值上评估trig,我可以使用map函数:
julia> out = map(trig, (0:(pi/12):(pi/2)))
out是一个7元素数组,在每个元素中,都有一个包含两个元素的元组:
julia> out
7-element Array{Tuple{Float64,Float64},1}:
(0.0,1.0)
(0.258819,0.965926)
(0.5,0.866025)
(0.707107,0.707107)
(0.866025,0.5)
(0.965926,0.258819)
(1.0,6.12323e-17)
我的问题是:解开我的正弦和余弦的最佳方法是什么,以便我有两个阵列,每个阵列有7个元素?是否可以在不创建多余的元组数组的情况下广播trig,而是直接创建我真正感兴趣的两个数组?
暂时,我再次调用map以便从out中提取值以填充我想要的数组,但我不认为这是最好的方法:
sines = map(x->x[1], out)
cosines = map(x->x[2], out)
出于这个问题的目的,假设trig是计算上昂贵的函数。所以,请不要给我一个答案,要求对trig进行多次评估。
答案 0 :(得分:1)
感谢您分享您之前在我的搜索中忽略的问题的答案。在今天之前,我从未听说过getIndex函数,但似乎getindex是我想要的函数,前提是我通过在前面放一个点来对其进行矢量化:
julia> @time sine_map = map(x->x[1], out)
0.051494 seconds (13.32 k allocations: 602.941 KB)
7-element Array{Float64,1}:
0.0
0.258819
0.5
0.707107
0.866025
0.965926
1.0
julia> @time sine_geti = getindex.(out, 1)
0.029560 seconds (9.24 k allocations: 416.910 KB)
7-element Array{Float64,1}:
0.0
0.258819
0.5
0.707107
0.866025
0.965926
1.0
julia> @time cosine_map = map(x->x[2], out)
0.037328 seconds (13.32 k allocations: 602.941 KB)
7-element Array{Float64,1}:
1.0
0.965926
0.866025
0.707107
0.5
0.258819
6.12323e-17
julia> @time cosey_geti = getindex.(out, 2)
0.024785 seconds (9.24 k allocations: 416.910 KB)
7-element Array{Float64,1}:
1.0
0.965926
0.866025
0.707107
0.5
0.258819
6.12323e-17
将拨款数量减少30%无需打喷嚏。谢谢。
我认为我更安全,这更加简洁:
@time sines, cosines = map(x->getindex.(out, x), 1:2)
0.062047 seconds (20.81 k allocations: 956.831 KB)
2-element Array{Array{Float64,1},1}:
[0.0,0.258819,0.5,0.707107,0.866025,0.965926,1.0]
[1.0,0.965926,0.866025,0.707107,0.5,0.258819,6.12323e-17]
感谢Colin T Bowers建议我可以为trig定义一个自定义方法。如果getindex无法提供我想要的性能,我肯定会考虑这样做。