Vector 关于向量在Julia中的行为

Vector 关于向量在Julia中的行为,vector,julia,division,broadcast,Vector,Julia,Division,Broadcast,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转置向量。我可以接受向量之和进行除法,但为什么要转置呢?或者为什么不直接返回一个标量?它似

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转置向量。我可以接受向量之和进行除法,但为什么要转置呢?或者为什么不直接返回一个标量?

它似乎在计算,然后乘以3

使用
@which 3/[2;2]
等来查看实际发生的情况,我发现它最终在
stdlib/linearagebra/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
在给定的情况下,它实际上变成了转置([2;2])/sum(abs2,[2;2])
,这是伪逆


然而,这有点超出我的理解力。因此,更有资格的人可能会证明我错了。

它只是给出了右侧操作数的伪逆

julia> ?/
...  
Right division operator: multiplication of x by the inverse of y on the right.
虽然乍一看似乎令人惊讶,但实际上这是一种自然行为。rowvector*columnvector给出一个标量,因此标量除以列向量应该给出一个行向量,就是这样。请注意,
RowVector
在1.0中已被删除,您得到的实际上是一个用
Transpose
表示的行向量

您可以编写
@less1/[2;2]
来查看实际发生的情况

另外,对于某些用例,还可以查看以更深入地了解行为