在Julia中,具有點.
的矢量化函數用於按元素操作。在Julia中評估具有矢量化函數的組合
運行f.(x)
意味着f(x[1])
,f(x[2])
,......依次執行
但是,假設我有一個函數,它接受兩個參數,說g(x,y)
我想g(x[1],y[1])
,g(x[2],y[1])
,g(x[3],y[1])
,... ,g(x[1],y[2])
,g(x[2],y[2])
,g(x[3],y[2])
,...
有沒有什麼辦法來評估x
和的所有組合?
在Julia中,具有點.
的矢量化函數用於按元素操作。在Julia中評估具有矢量化函數的組合
運行f.(x)
意味着f(x[1])
,f(x[2])
,......依次執行
但是,假設我有一個函數,它接受兩個參數,說g(x,y)
我想g(x[1],y[1])
,g(x[2],y[1])
,g(x[3],y[1])
,... ,g(x[1],y[2])
,g(x[2],y[2])
,g(x[3],y[2])
,...
有沒有什麼辦法來評估x
和的所有組合?
馬特的答案是好的,但我想提供使用數組理解的選擇:
julia> x = 1:5
y = 10:10:50
[i + j for i in x, j in y]
5×5 Array{Int64,2}:
11 21 31 41 51
12 22 32 42 52
13 23 33 43 53
14 24 34 44 54
15 25 35 45 55
在我看來,陣列的理解往往更容易閱讀,比broadcast
和reshape
更加靈活。
是的,重塑y
,使它正交於x
。 .
矢量化使用broadcast
來完成其工作。我把它想象成在所有其他維度上「擠壓」單體尺寸。
這意味着,對於矢量x
和y
,你可以簡單地重塑他們的一個評價x
和y
所有組合的產品:
julia> x = 1:5
y = 10:10:50
(+).(x, reshape(y, 1, length(y)))
5×5 Array{Int64,2}:
11 21 31 41 51
12 22 32 42 52
13 23 33 43 53
14 24 34 44 54
15 25 35 45 55
請注意,數組的形狀的方向相匹配爭論; x
跨越行,並且y
跨越列,因爲它被轉置爲單行矩陣。
還應該注意''reshape'創建一個視圖,因此不會創建一個臨時數組。所以在做這件事時不用擔心性能。 –
有沒有什麼理由比'func(x,y。')更喜歡這個,或者在這種情況下是'x。+ y.''?移調也創建一個視圖。 **編輯:**糟糕,它只在0.6版本上,在0.5你必須使用重塑,但在這種情況下,內存使用應該不重要。 – DNF
是的。現在,轉置和ctranspose不適用於非數字元素的數組。謝天謝地,這看起來可能會改變。 –
同意!這絕對更可讀。 –
謝謝!在可讀性方面,這看起來更好,但都很好 – sholi