我目前正试图将100万订单的巨大矩阵反转100万,我认为反斜杠运算符将有助于这样做。知道它是如何实现的吗?我没有找到任何具体的例子,所以非常感谢任何帮助。
答案 0 :(得分:9)
知道它是如何实现的吗?
这是一个多算法。这显示了如何使用它:
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
这导致我们:https://github.com/JuliaLang/julia/blob/master/base/linalg/generic.jl#L827(由于版本差异,行号略有变化)。如您所见,它执行一些快速函数调用以确定它是什么类型的矩阵。 istril
找出其下三角形:https://github.com/JuliaLang/julia/blob/master/base/linalg/generic.jl#L987等。一旦确定了矩阵类型,它就会尽可能地对矩阵进行专门化,以使其有效,然后调用\
。这些专门的矩阵类型执行分解,然后\
进行后变换(这是在你自己的BTW上使用\
重新使用分解的好方法),或者它“直接知道”答案,如三角形或对角矩阵。
无法获得比源更具体的内容。
请注意,\
与仅反转略有不同。您通常不希望反转矩阵,更不用说大矩阵了。这些因子分解在数值上更稳定。但是,inv
会进行反转,这很像LU分解(在Julia中是lufact
)。您可能还希望在某些情况下查看psudo-inverse的pinv
,其中矩阵是单数或接近单数,但是你应该真的避免这个而不是因子化+解决系统而不是使用逆。 / p>
对于非常大的稀疏矩阵,您将需要使用迭代求解器。你会在IterativeSolvers.jl
中找到很多实现