2017-03-16 91 views
6

在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和的所有組合?

回答

5

馬特的答案是好的,但我想提供使用數組理解的選擇:

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 

在我看來,陣列的理解往往更容易閱讀,比broadcastreshape更加靈活。

+1

同意!這絕對更可讀。 –

+0

謝謝!在可讀性方面,這看起來更好,但都很好 – sholi

5

是的,重塑y,使它正交於x.矢量化使用broadcast來完成其工作。我把它想象成在所有其他維度上「擠壓」單體尺寸。

這意味着,對於矢量xy,你可以簡單地重塑他們的一個評價xy所有組合的產品:

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跨越列,因爲它被轉置爲單行矩陣。

+1

還應該注意''reshape'創建一個視圖,因此不會創建一個臨時數組。所以在做這件事時不用擔心性能。 –

+1

有沒有什麼理由比'func(x,y。')更喜歡這個,或者在這種情況下是'x。+ y.''?移調也創建一個視圖。 **編輯:**糟糕,它只在0.6版本上,在0.5你必須使用重塑,但在這種情況下,內存使用應該不重要。 – DNF

+0

是的。現在,轉置和ctranspose不適用於非數字元素的數組。謝天謝地,這看起來可能會改變。 –