2017-07-25 46 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)我想知道我們在茱莉亞是否有這樣的語言限制。 –