如何求解两个输入都稀疏的线性系统?

时间:2020-03-13 00:14:38

标签: julia sparse-matrix

茱莉亚(Julia)中有与CALL JREPL等价的东西吗?这是Python中函数的说明。

scipy.sparse.linalg.spsolve

我在Julia的In [59]: ?spsolve Signature: spsolve(A, b, permc_spec=None, use_umfpack=True) Docstring: Solve the sparse linear system Ax=b, where b may be a vector or a matrix. LinearAlgebra中找不到这个。有什么我想念的或其他选择吗?

谢谢

编辑

例如:

SparseArrays

在Julia中,使用In [71]: A = sparse.csc_matrix([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float) In [72]: B = sparse.csc_matrix([[2, 0], [-1, 0], [2, 0]], dtype=float) In [73]: spsolve(A, B).data Out[73]: array([ 1., -3.]) In [74]: spsolve(A, B).toarray() Out[74]: array([[ 0., 0.], [ 1., 0.], [-3., 0.]]) 运算符

\

1 个答案:

答案 0 :(得分:8)

是的,它是\函数。

julia> using SparseArrays, LinearAlgebra

julia> A = sprand(Float64, 20, 20, 0.01) + I # just adding the identity matrix so A is non-singular.

julia> typeof(A)
SparseMatrixCSC{Float64,Int64}

julia> v = rand(20);

julia> A \ v
20-element Array{Float64,1}:
 0.5930744938331236
 0.8726507741810358
 0.6846427450637211
 0.3135234897986168
 0.8366321472466727
 0.11338490488638651
 0.3679058951515244
 0.4931583108292607
 0.3057947282994271
 0.27481281228206955
 0.888942874188458
 0.905356044150361
 0.17546911165214607
 0.13636389619386557
 0.9607381212005248
 0.2518153541168824
 0.6237205353883974
 0.6588050295549153
 0.14748809413104935
 0.9806131247053784

根据问题编辑进行编辑:

如果您想让v成为稀疏矩阵B,那么我们可以使用QR的{​​{1}}分解继续进行(请注意{{ 1}}真正稀疏是罕见的:

B

现在:

B

我们可以进行测试以确保我们做对了:

function myspsolve(A, B)
    qrB = qr(B)
    Q, R = qrB.Q, qrB.R
    R = [R; zeros(size(Q, 2) - size(R, 1), size(R, 2))]
    A\Q * R
end