在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
和y
的所有组合?
Matt 的回答很好,但我想使用数组理解提供另一种选择:
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
跨越列,因为它被转置为单行矩阵。