She*_*yan 5 constants sparse-matrix julia
我有一个矩阵 ,M其形式非常简单:M[i,j]=aifi==j和M[i,j]=belse 。M非常大(> 10000),所以我无法在不使用某种稀疏矩阵的情况下初始化或存储它。存储该矩阵的最佳方法似乎是使用某种稀疏矩阵,其中非条目设置b为而不是零。
我努力了
M = spdiagm((a-b), N, N) .+ b
Run Code Online (Sandbox Code Playgroud)
但这样做会存储M为具有 100 个条目的 10 x 10 矩阵,这似乎意味着没有压缩。
有没有更好的方法来初始化这个矩阵?
这取决于您想对矩阵做什么,但如果您只对执行矩阵向量乘积感兴趣,则可以将该包与该包FillArrays.jl结合使用:LinearMaps.jl
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}\nRun Code Online (Sandbox Code Playgroud)\n然后你可以执行类似的操作
\njulia> 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}\nRun Code Online (Sandbox Code Playgroud)\n矩阵使用“惰性”方法存储,并且不在内存中扩展,因此n可能很大。然而,必须注意这M不是AbstractMatrix:
julia> supertype(typeof(M))\nLinearMap{Float64}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |