3/[2;2]
给出
1×2 LinearAlgebra.Transpose{Float64,Array{Float64,1}}:
0.75 0.75
3 ./[2;2]
给出
2-element Array{Float64,1}:
1.5
1.5
第二个很容易理解。它广播3
并执行逐元素划分。但是,执行第一个操作的原因是什么呢?我假设它取了矢量的总和,即2x1,将3除以4,并将其广播到1x2转置的矢量中。我可以接受取向量的总和来执行除法运算,但是为什么要转置?还是为什么不只返回一个标量?
答案 0 :(得分:4)
它只是给出右侧操作数的伪逆。
julia> ?/
...
Right division operator: multiplication of x by the inverse of y on the right.
尽管乍一看似乎令人惊讶,但这实际上是自然行为。 rowvector * columnvector给出标量,因此标量除以列矢量应得到行矢量,这种情况就是这种情况。请注意,RowVector
在1.0中已被删除,实际上您得到的是一个用Transpose
表示的行向量。
您可以写@less 1 / [2;2]
来查看实际发生的情况。
也请看一下this GitHub issue,以了解更多有关该行为的信息,并查看this discourse topic,以了解某些用例。
答案 1 :(得分:2)
似乎正在计算pseudoinverse of the vector,然后乘以3。
使用@which 3/[2;2]
等查看实际发生的情况,我发现它最终在stdlib/LinearAlgebra/generic.jl
中调用以下方法:
function _vectorpinv(dualfn::Tf, v::AbstractVector{Tv}, tol) where {Tv,Tf}
res = dualfn(similar(v, typeof(zero(Tv) / (abs2(one(Tv)) + abs2(one(Tv))))))
den = sum(abs2, v)
# as tol is the threshold relative to the maximum singular value, for a vector with
# single singular value σ=√den, σ ≦ tol*σ is equivalent to den=0 ∨ tol≥1
if iszero(den) || tol >= one(tol)
fill!(res, zero(eltype(res)))
else
res .= dualfn(v) ./ den
end
return res
end
在给定情况下实际上变为transpose([2;2])/sum(abs2, [2;2])
,它是伪逆。
但是,这有点超出我的头了。所以更有资格的人可能会证明我错了。