我目前正在尝试翻转100万×100万的巨大矩阵,我想反斜杠运算符在这方面会很有帮助。你知道它是如何实现的吗?我没有找到任何具体的例子,所以非常感谢您的帮助。
有任何想法它是如何实现的吗?
这是一个多算法。以下是如何使用它:
julia> A = rand(10,10)
10×10 Array{Float64,2}:
0.330453 0.294142 0.682869 0.991427 … 0.533443 0.876566 0.157157
0.666233 0.47974 0.172657 0.427015 0.501511 0.0978822 0.634164
0.829653 0.380123 0.589555 0.480963 0.606704 0.642441 0.159564
0.709197 0.570496 0.484826 0.17325 0.699379 0.0281233 0.66744
0.478663 0.87298 0.488389 0.188844 0.38193 0.641309 0.448757
0.471705 0.804767 0.420039 0.0528729 … 0.658368 0.911007 0.705696
0.679734 0.542958 0.22658 0.977581 0.197043 0.717683 0.21933
0.771544 0.326557 0.863982 0.641557 0.969889 0.382148 0.508773
0.932684 0.531116 0.838293 0.031451 0.242338 0.663352 0.784813
0.283031 0.754613 0.938358 0.0408097 0.609105 0.325545 0.671151
julia> b = rand(10)
10-element Array{Float64,1}:
0.0795157
0.219318
0.965155
0.896807
0.701626
0.741823
0.954437
0.573683
0.493615
0.0821557
julia> A\b
10-element Array{Float64,1}:
1.47909
2.39816
-0.15789
0.144003
-1.10083
-0.273698
-0.775122
0.590762
-0.0266894
-2.36216
@which
查看其定义方式:julia> @which A\b
\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805
istril
用于确定其是否为下三角形:https://github.com/JuliaLang/julia/blob/master/base/linalg/generic.jl#L987 等。一旦确定矩阵类型,它尽可能地将矩阵特化以使其高效,并然后调用\
。这些专门的矩阵类型要么执行一个因式分解,然后 \
进行反向替换(顺便说一句,这是在自己的代码中使用 \
重新使用因子分解的好方法),要么“直接知道”答案,例如对于三角形或对角线矩阵。\
稍微不同于简单地求逆。通常情况下,您不想求逆矩阵,更不用说大矩阵了。这些分解方法在数值上更加稳定。然而,inv
会执行求逆运算,类似于LU分解(Julia中为 lufact
)。您还可以尝试使用 pinv
来获得伪逆矩阵,在某些矩阵奇异或接近奇异的情况下,但是您真的应该避免使用它,而是分解+解决系统而不是使用逆矩阵。