关于 Julia 中 / by vector 的行为
About behaviour of / by vector in Julia
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 转置向量。我可以接受向量的总和来执行除法,但为什么要转置?或者为什么不只是 return 一个标量?
好像是计算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])
,这是伪逆。
但是,这有点超出了我的理解范围。所以更有资格的人可能会证明我错了。
它只是给出了右侧操作数的伪逆。
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 to understand the behaviour a bit more and this discourse topic 了解一些用例。
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 转置向量。我可以接受向量的总和来执行除法,但为什么要转置?或者为什么不只是 return 一个标量?
好像是计算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])
,这是伪逆。
但是,这有点超出了我的理解范围。所以更有资格的人可能会证明我错了。
它只是给出了右侧操作数的伪逆。
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 to understand the behaviour a bit more and this discourse topic 了解一些用例。