偶然发现的:
julia> 1 / [1., 2, 3.]
1×3 transpose(::Vector{Float64}) with eltype Float64:
0.0714286 0.142857 0.214286
这个结果不是太懂
偶然发现的:
julia> 1 / [1., 2, 3.]
1×3 transpose(::Vector{Float64}) with eltype Float64:
0.0714286 0.142857 0.214286
这个结果不是太懂
计算伪逆,不过处理 0 会出问题
a = [1, 2]
@show 1 / a * a == 1 # true
b = [0, 0]
@show 1 / b * b == 1 # false
@edit 1 / a
查看代码:
/(x::Number, v::AbstractVector) = x*pinv(v)
pinv(v::AbstractVector{T}, tol::Real = real(zero(T))) where {T<:Real} = _vectorpinv(transpose, v, tol)
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
附一段 ChatGPT 的解释,自行甄别
这是一个 Julia 函数
_vectorpinv
,用于计算一个向量v
的伪逆。该函数有三个参数:dualfn
是一个作用于向量的函数;v
是一个类型为Tv
的抽象向量;tol
是一个容差值。
函数首先使用dualfn
和一个与v
具有相同长度和元素类型的临时向量计算出一个结果res
。然后,它计算分母den
,即v
中元素平方的和。
如果den
为零或者tol
大于等于1,则将res
填充为零。否则,res
被设置为将dualfn
应用于v
,每个元素除以den
得到的结果。
最后,该函数返回res
,其中包含了v
的伪逆。