在 Julia 中,大型稀疏矩阵的 eigs() 函数出错了
Posted
技术标签:
【中文标题】在 Julia 中,大型稀疏矩阵的 eigs() 函数出错了【英文标题】:In Julia, The eigs() function for large sparse matrix went wrong 【发布时间】:2017-04-10 11:21:30 【问题描述】:使用 Julia,我使用 spzeros() 函数创建了一个稀疏矩阵,用一些句子初始化了矩阵,并尝试计算它的特征值。但是,该函数仅适用于小的稀疏矩阵(n
代码:
ns = 400 # 800
H = spzeros(Complex128, ns, ns)
#... initialization
E, x = eigs(H)
最后一句后的错误信息:
LoadError: Base.LinAlg.ARPACKException("未指定的 ARPACK 错误:1") 在加载 In[7] 时,从第 1 行开始的表达式中
在 aupd_wrapper(::TypeT, ::Base.LinAlg.#matvecA!#69SparseMatrixCSCComplexFloat64,Int64, ::Base.LinAlg.##63#70, :: Base.LinAlg.##64#71, ::Int64, ::Bool, ::Bool, ::String, ::Int64, ::Int64, ::String, ::Float64, ::Int64, ::Int64, ::ArrayComplexFloat64,1) 在 .\linalg\arpack.jl:53 在#_eigs#62(::Int64, ::Int64, ::Symbol, ::Float64, ::Int64, ::Void, ::ArrayComplexFloat64,1, ::Bool, ::Base。 LinAlg.#_eigs, ::SparseMatrixCSCComplexFloat64,Int64, ::UniformScalingInt64) 在 .\linalg\arnoldi.jl:268 在 (::Base.LinAlg.#kw##_eigs)(::ArrayAny,1, ::Base.LinAlg.#_eigs, ::SparseMatrixCSCComplexFloat64,Int64, ::UniformScalingInt64 ) 在 .\:0 在#eigs#55(::ArrayAny,1, ::Function, ::SparseMatrixCSCComplexFloat64,Int64, ::UniformScalingInt64) at .\linalg\arnoldi.jl:78 在 (::Base.LinAlg.#kw##eigs)(::ArrayAny,1, ::Base.LinAlg.#eigs, ::SparseMatrixCSCComplexFloat64,Int64, ::UniformScalingInt64 ) 在 .\:0 在 #eigs#59(::ArrayAny,1, ::Function, ::SparseMatrixCSCComplex,Int64, ::UniformScalingInt64) at .\linalg\arnoldi.jl:85 在 (::Base.LinAlg.#kw##eigs)(::ArrayAny,1, ::Base.LinAlg.#eigs, ::SparseMatrixCSCComplex,Int64, ::UniformScalingInt64) 在.\:0 在 #eigs#54(::ArrayAny,1, ::Function, ::SparseMatrixCSCComplex,Int64) at .\linalg\arnoldi.jl:77 在 (::Base.LinAlg.#kw##eigs)(::ArrayAny,1, ::Base.LinAlg.#eigs, ::SparseMatrixCSCComplex,Int64) 在 .\:0
【问题讨论】:
最好给出一个产生错误的特定矩阵。可能在链接的 sn-p 中(例如,参见 pastebin) 【参考方案1】:ARPACK 错误 1,来自快速的 Google 搜索,似乎是“最大迭代次数”。因此,您的矩阵必须使得 ARPACK 的算法无法找到特征值。
从discussions elsewhere 看来,该问题似乎可以通过删除度数为零的顶点(或通常为零行)或通过将矩阵拆分为连通分量(即块)并找到每个块的特征值来解决分开。
【讨论】:
以上是关于在 Julia 中,大型稀疏矩阵的 eigs() 函数出错了的主要内容,如果未能解决你的问题,请参考以下文章