关于Julia中/向量的行为

时间:2018-08-23 12:37:18

标签: 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转置的矢量中。我可以接受取向量的总和来执行除法运算,但是为什么要转置?还是为什么不只返回一个标量?

2 个答案:

答案 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]),它是伪逆。

但是,这有点超出我的头了。所以更有资格的人可能会证明我错了。