Cza*_*ar' 5 operators backslash julia
我目前正试图将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
Run Code Online (Sandbox Code Playgroud)
您可以使用@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
Run Code Online (Sandbox Code Playgroud)
这导致我们: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).您可能还希望pinv在某些情况下查看psudo-inverse,其中矩阵是单数或接近单数,但您应该避免这种情况而不是因子分解+解决系统而不是使用逆.
对于非常大的稀疏矩阵,您将需要使用迭代求解器.你会在IterativeSolvers.jl中找到很多实现