我对 Julia 很陌生,我对 Julia 中的矢量化操作很好奇。
例子:
x = [2 3 4]
y = [3 4 5]
如果我运行上面的:x + y
我得到:1×3 Array{Int64,2}:
5 7 9
但如果我这样做:x/y
我得到:1×1 Array{Float64,2}:
0.7600000000000002
我无法理解,经过一些研究,我发现 x./y 是进行矢量化操作的正确方法,但我想知道加号是如何工作的。这是我的问题:
这背后的直觉是什么(使加号矢量化而不是除法运算符)?
当我做 x/y 时会发生什么?为什么 .76000 会作为答案出现。
我希望这不是重复的,如果是请告诉我。我要把它去掉。首先十分感谢。请帮忙。
最佳答案
AFAICT +
操作符不会自动广播:
julia> 1 + [2, 3]
ERROR: MethodError: no method matching +(::Int64, ::Array{Int64,1})
For element-wise addition, use broadcasting with dot syntax: scalar .+ array
julia> [1 2] + [3, 4]
ERROR: DimensionMismatch("dimensions must match: a has dims (Base.OneTo(1), Base.OneTo(2)), b has dims (Base.OneTo(2),), mismatch at 1")
你必须分别写:julia> 1 .+ [2, 3]
2-element Array{Int64,1}:
3
4
julia> [1 2] .+ [3, 4]
2×2 Array{Int64,2}:
4 5
5 6
然而,重要的是 +
对于完全相同维度的数组是一个有效的操作(在数学意义上),这就是为什么它有效:julia> [2 3 4] + [3 4 5]
1×3 Array{Int64,2}:
5 7 9
请注意,这不是广播,而只是线性代数。现在关于
x / y
您可以检查它是否定义为:help?> x / y
/(x, y)
Right division operator: multiplication of x by the inverse of y on the right.
所以你有了:julia> using LinearAlgebra
julia> x * pinv(y)
1×1 Array{Float64,2}:
0.7600000000000005
(实际的实现有点不同——我在这里使用了一种简化的方法)
关于julia - 为什么加号运算符在 Julia 中被矢量化而不是除法运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65214708/