2017-07-25 45 views
4

我目前正在尝试颠倒100万的大型矩阵100万,我认为反斜杠操作符会对此有所帮助。任何想法如何实施?我没有找到任何具体的例子,所以任何帮助都非常感谢。如何在Julia中使用反斜杠运算符?

回答

8

有关它如何实现的任何想法?

这是一个多算法。这展示了如何使用它:

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.38.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)。在矩阵奇异或接近奇异的某些情况下,您可能还想查看pinv的psudo-inverse,但您应该真正避免这种情况,而不是分解因子分解+而不是使用逆。

对于非常大的稀疏矩阵,您需要使用迭代求解器。你会在IterativeSolvers.jl

+5

中发现很多实现。一个10^6 x 10^6密集的Float64矩阵需要7.3TB的RAM。由于反转稀疏矩阵会生成一个稠密矩阵,因此实际上并不想要反转矩阵。这是一个很好的经验法则:不要反转,解决。 – StefanKarpinski

+0

感谢您的帮助。我现在正在使用反斜杠运算符。我也在尝试inv()调用它,但它给了我stackoverflow错误。我搜索了一个机制来限制julia使用的系统RAM(我的系统有1TB的RAM)我想知道我们在茱莉亚是否有这样的语言限制。 –