关于通过向量朱莉娅/行为

问题描述 投票:3回答:2

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和执行单元方式划分。但是,什么是具有表现为它做的第一操作背后的原因何在呢?我假定它采取了载体,其是2×1的总和,由4执行的3分割,并将其广播到1×2转置矢量。我可以接受以矢量的总和来进行划分,但为什么转?或者为什么不直接返回一个标?

vector julia division broadcast
2个回答
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


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])这是伪逆。

然而,这是一个有点在我头上。因此,有人更合格的会证明我错了。

© www.soinside.com 2019 - 2024. All rights reserved.