矩阵向量加法的Julia双广播?

矩阵向量加法的Julia双广播?,julia,julia-flux,Julia,Julia Flux,新手茱莉亚,我问你。给定两个数组 W = [randn(3,2), randn(3,2)] b = [randn(3), randn(3)] 我想做一个“嵌套广播”,内容如下: W .+ b = [W[1].+b[1], W[2].+b[2]] 到目前为止我能想到的最好的办法是 [Wi.+bi (Wi,bi) for zip(W,b)] 来自Python的背景让人觉得这是亵渎神灵的。在Julia中有更好的方法吗?您可以执行以下操作: julia> W = [randn(3,2), r

新手茱莉亚,我问你。给定两个数组

W = [randn(3,2), randn(3,2)]
b = [randn(3), randn(3)]
我想做一个“嵌套广播”,内容如下:

W .+ b = [W[1].+b[1], W[2].+b[2]]
到目前为止我能想到的最好的办法是

[Wi.+bi (Wi,bi) for zip(W,b)]

来自Python的背景让人觉得这是亵渎神灵的。在Julia中有更好的方法吗?

您可以执行以下操作:

julia> W = [randn(3,2), randn(3,2)]
2-element Array{Array{Float64,2},1}:
 [0.39179718902868116 -0.5387622679356612; -0.594274465053327 0.018804631512093436; -2.273706742420988 -0.4638617400026042]
 [0.3249960563405678 -0.4877554417492699; 0.5036437919340767 1.3172770503034696; 0.03501532820428975 -0.2675024677340758]

julia> b = [randn(3), randn(3)]
2-element Array{Array{Float64,1},1}:
 [1.2571527266220441, 0.21599608118129476, 0.21498843153804936]
 [-0.528960345932853, 0.5610435189953311, -0.8636370930615718]

# A helper function which broadcasts once
julia> s_(Wi, bi) = Wi .+ bi
s_ (generic function with 1 method)

# Broadcast the helper function
julia> s_.(W, b)
2-element Array{Array{Float64,2},1}:
 [1.6489499156507252 0.718390458686383; -0.3782783838720323 0.2348007126933882; -2.0587183108829388 -0.24887330846455485]
 [-0.20396428959228524 -1.016715787682123; 1.0646873109294077 1.8783205692988008; -0.828621764857282 -1.1311395607956476]

如注释中所述,您可以使用其中一个可用的来命名helper函数,这允许更好的语法(下面使用的特定符号可以通过键入
\oplus
然后键入Tab来获得):


或者-同样如注释中所述-如果您不想显式声明助手函数:

julia> ((Wi, bi)->Wi.+bi).(W, b)
2-element Array{Array{Float64,2},1}:
 [1.6489499156507252 0.718390458686383; -0.3782783838720323 0.2348007126933882; -2.0587183108829388 -0.24887330846455485]
 [-0.20396428959228524 -1.016715787682123; 1.0646873109294077 1.8783205692988008; -0.828621764857282 -1.1311395607956476]

(我个人阅读上一个版本比较困难,但是YMMV)

当你想广播时,然后广播
广播

julia> broadcast.(+, W, b)
2-element Array{Array{Float64,2},1}:
 [-0.7364111670769904 0.010994354421031916; -0.9010128415786036 0.22868802910609998; 1.2030371118617933 0.21305414210853912]
 [0.19183885867446926 0.5362077496502086; 1.5909421118115665 0.1235808501390212; 1.5190965380769597 0.1883638848487652]     

julia> [W[1].+b[1], W[2].+b[2]]
2-element Array{Array{Float64,2},1}:
 [-0.7364111670769904 0.010994354421031916; -0.9010128415786036 0.22868802910609998; 1.2030371118617933 0.21305414210853912]
 [0.19183885867446926 0.5362077496502086; 1.5909421118115665 0.1235808501390212; 1.5190965380769597 0.1883638848487652] 

或者只是
((Wi,bi)->Wi.+bi)。(W,b)
有很多中缀运算符,它们没有预先存在的含义,这是一种创建辅助函数的整洁方法。例如
⊞(x,y)=x.+y
(键入\boxplus选项卡),然后
W。⊞ b
julia> broadcast.(+, W, b)
2-element Array{Array{Float64,2},1}:
 [-0.7364111670769904 0.010994354421031916; -0.9010128415786036 0.22868802910609998; 1.2030371118617933 0.21305414210853912]
 [0.19183885867446926 0.5362077496502086; 1.5909421118115665 0.1235808501390212; 1.5190965380769597 0.1883638848487652]     

julia> [W[1].+b[1], W[2].+b[2]]
2-element Array{Array{Float64,2},1}:
 [-0.7364111670769904 0.010994354421031916; -0.9010128415786036 0.22868802910609998; 1.2030371118617933 0.21305414210853912]
 [0.19183885867446926 0.5362077496502086; 1.5909421118115665 0.1235808501390212; 1.5190965380769597 0.1883638848487652]