我在和Julia一起工作时遇到了一个我不明白的案例:
1. /
vs 1 ./
第二种和第三种方法产生了我所期望的结果,而第一种方法则没有。 我还可以看到比率是倒置的(即
result1[3] / result[1] = 4.0
而 result2[3] / result2[1] = 0.25
)。
我只是好奇有什么区别。我知道这是
dot broadcasting
,但我无法对这种情况产生任何吸引力。
Δx = [2.0, 4.0, 8.0]
result1 = 1. / Δx
result2 = 1 ./ Δx
result3 = 1. ./ Δx
println(result1) # Output: [0.023809523809523808 0.047619047619047616 0.09523809523809523]
println(result2) # Output: [0.5, 0.25, 0.125]
println(result3) # Output: [0.5, 0.25, 0.125]
println(result1[3] / result1[1]) # Output: 4.0
println(result2[3] / result2[1]) # Output: 0.25
更新:
result1 = 1. /[2.0, 4.0, 8.0]
# Output:
# 1×3 transpose(::Vector{Float64}) with eltype Float64:
# 0.0238095 0.047619 0.0952381
result2 = 1 ./[2.0, 4.0, 8.0]
# Output:
# 3-element Vector{Float64}:
# 0.5
# 0.25
# 0.125
表达式
1. /
和 1 ./
的不同之处在于,第一个标记为 1.
和 /
,而第二个标记为 1
和 ./
。
1
和 1.
是数字。前者是整数,后者是浮点数。
./
操作符,因为它前面的.
,是一个广播操作,即/
应用于某物的每个元素。 1 ./ [1,2,3]
相当于 [1/1, 1/2, 1/3]
。
/
运算符是通常除法。在某些类型上,它被定义为其他东西。
在 Julia 中,许多数学事物被定义为具有对整个对象而不是其元素进行操作的数学运算符。示例:矩阵上的
*
导致矩阵乘法,而不是元素运算。
对
@code_lowered 1 / [1, 2, 4]
的调查表明,伪逆 (LinearAlgebra.pinv
) 应用于向量。