我在Julia Users组中找到了一些讨论,但对我来说太技术化了。
我想知道在这两者之间进行选择的标准是什么。
我正在关注JuliaBox教程,但解释不多。谢谢
答案 0 :(得分:1)
map
和broadcast
在处理多个不同维度的集合时是不同的。尽管broadcast
会尝试将所有对象强制转换为一个公共尺寸,但map
会直接将给定的函数逐元素应用。
julia> map(+, 1, [2,2,2])
1-element Array{Int64,1}:
3
julia> broadcast(+, 1, [2,2,2])
3-element Array{Int64,1}:
3
3
3
广播示例的结果与map(+, [1,1,1], [2,2,2])
相同。
还请注意,broadcast
在找不到两个参数之间的共同维数时的行为:
julia> broadcast(+, [1,2,3], [2 2; 2 0])
ERROR: DimensionMismatch("arrays could not be broadcast to a common size")
Stacktrace:
[1] _bcs1 at ./broadcast.jl:439 [inlined]
[2] _bcs at ./broadcast.jl:433 [inlined]
[3] broadcast_shape at ./broadcast.jl:427 [inlined]
[4] combine_axes at ./broadcast.jl:422 [inlined]
[5] instantiate at ./broadcast.jl:266 [inlined]
[6] materialize at ./broadcast.jl:748 [inlined]
[7] broadcast(::typeof(+), ::Array{Int64,1}, ::Array{Int64,2}) at ./broadcast.jl:702
[8] top-level scope at none:0
julia> map(+, [1,2,3], [2 2; 2 0])
3-element Array{Int64,1}:
3
4
答案 1 :(得分:1)
两个方法都将函数应用于其参数。两者之间的区别在于它们如何处理多维数组。
map
首先尝试对数组列进行压缩,创建一个元组的迭代器,该迭代器用作给定函数的参数。因此
julia> map(+, [1,2,3,4], [10, 20, 30, 40])
4-element Array{Int64,1}:
11
22
33
44
同时
julia> map(+, [1,2,3,4], [10 20; 30 40])
4-element Array{Int64,1}:
11
32
23
44
更改第二个数组的布局时,请注意元素配对。另一方面,broadcast
对给定函数进行逐元素应用。如果两个数组参数的维数相同,则元素的配对类似于map
。
julia> broadcast(+, [1,2,3,4], [10, 20, 30, 40])
4-element Array{Int64,1}:
11
22
33
44
否则,broadcast
检查两个数组是否在至少一个维度上匹配,并且至少一个数组的另一个维度等于1。如果满足此条件,则broadcast
扩展数组通过沿等于1的维度复制数组数据将其更改为通用大小。这是您获得的方式
julia> broadcast(+, [1, 2, 3, 4], [10 20 30 40])
4×4 Array{Int64,2}:
11 21 31 41
12 22 32 42
13 23 33 43
14 24 34 44