如何在Julia中使用反斜杠运算符?

7

我目前正在尝试翻转100万×100万的巨大矩阵,我想反斜杠运算符在这方面会很有帮助。你知道它是如何实现的吗?我没有找到任何具体的例子,所以非常感谢您的帮助。

1个回答

14

有任何想法它是如何实现的吗?

这是一个多算法。以下是如何使用它:

julia> A = rand(10,10)
10×10 Array{Float64,2}:
 0.330453  0.294142  0.682869  0.9914270.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.05287290.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 等。一旦确定矩阵类型,它尽可能地将矩阵特化以使其高效,并然后调用\。这些专门的矩阵类型要么执行一个因式分解,然后 \ 进行反向替换(顺便说一句,这是在自己的代码中使用 \ 重新使用因子分解的好方法),要么“直接知道”答案,例如对于三角形或对角线矩阵。
源代码已经非常具体。
请注意,\ 稍微不同于简单地求逆。通常情况下,您不想求逆矩阵,更不用说大矩阵了。这些分解方法在数值上更加稳定。然而,inv 会执行求逆运算,类似于LU分解(Julia中为 lufact)。您还可以尝试使用 pinv 来获得伪逆矩阵,在某些矩阵奇异或接近奇异的情况下,但是您真的应该避免使用它,而是分解+解决系统而不是使用逆矩阵。
对于非常大的稀疏矩阵,您需要使用迭代求解器。您将在 IterativeSolvers.jl 中找到许多实现。

8
一块由浮点数(Float64)构成的 $10^6 \times 10^6$ 的密集矩阵需要占用 7.3 TB 的内存。由于求一个稀疏矩阵的逆矩阵会得到一个密集矩阵,因此实际上你不需要求逆矩阵。这是一个好的经验法则:不要求逆,而是求解。 - StefanKarpinski
感谢您的帮助。我现在正在使用反斜杠运算符。我也尝试了inv()调用,但它给我返回了stackoverflow错误。我搜索了一种机制来限制julia使用的系统RAM,因为我的系统有1TB的RAM。我想知道julia是否有这样的语言限制。 - Czar'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接