Julia 中用常量填充的稀疏数组

She*_*yan 5 constants sparse-matrix julia

我有一个矩阵 ,M其形式非常简单:M[i,j]=aifi==jM[i,j]=belse 。M非常大(> 10000),所以我无法在不使用某种稀疏矩阵的情况下初始化或存储它。存储该矩阵的最佳方法似乎是使用某种稀疏矩阵,其中非条目设置b为而不是零。

我努力了

M = spdiagm((a-b), N, N) .+ b
Run Code Online (Sandbox Code Playgroud)

但这样做会存储M为具有 100 个条目的 10 x 10 矩阵,这似乎意味着没有压缩。

有没有更好的方法来初始化这个矩阵?

Pic*_*ent 5

这取决于您想对矩阵做什么,但如果您只对执行矩阵向量乘积感兴趣,则可以将该包与该包FillArrays.jl结合使用:LinearMaps.jl

\n
julia> using LinearMaps, FillArrays\n\njulia> n=100 # can be bigger\n100\n\njulia> a=2.0\n2.0\n\njulia> b=3.0\n3.0\n\njulia> M=(a-b)*LinearMap(Eye(n,n))+b*LinearMap(Ones(n,n))\n100\xc3\x97100 LinearMaps.LinearCombination{Float64} with 2 maps:\n  100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: -1.0 of\n    100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n      100\xc3\x97100 Eye{Float64}\n  100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: 3.0 of\n    100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n      100\xc3\x97100 Ones{Float64}\n
Run Code Online (Sandbox Code Playgroud)\n

然后你可以执行类似的操作

\n
julia> x=rand(n);\n\njulia> M*x;\n\njulia> x'*M;\n    \njulia> M*M\n100\xc3\x97100 LinearMaps.CompositeMap{Float64} with 2 maps:\n  100\xc3\x97100 LinearMaps.LinearCombination{Float64} with 2 maps:\n    100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: -1.0 of\n      100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n        100\xc3\x97100 Eye{Float64}\n    100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: 3.0 of\n      100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n        100\xc3\x97100 Ones{Float64}\n  100\xc3\x97100 LinearMaps.LinearCombination{Float64} with 2 maps:\n    100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: -1.0 of\n      100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n        100\xc3\x97100 Eye{Float64}\n    100\xc3\x97100 LinearMaps.ScaledMap{Float64} with scale: 3.0 of\n      100\xc3\x97100 LinearMaps.WrappedMap{Float64} of\n        100\xc3\x97100 Ones{Float64}\n
Run Code Online (Sandbox Code Playgroud)\n

矩阵使用“惰性”方法存储,并且不在内存中扩展,因此n可能很大。然而,必须注意这M不是AbstractMatrix

\n
julia> supertype(typeof(M))\nLinearMap{Float64}\n
Run Code Online (Sandbox Code Playgroud)\n

  • @PicaudVincent你的矩阵在对角线上有“a+b”。我认为你需要用 `M=(ab)*LinearMap(Eye(n,n))+b*LinearMap(Ones(n,n))` 来初始化它 (2认同)