稀疏矩阵对角化的快速方法(julia):为什么arpack这么慢?

稀疏矩阵对角化的快速方法(julia):为什么arpack这么慢?,julia,linear-algebra,arpack,Julia,Linear Algebra,Arpack,对于我的问题,我只对稀疏实对称矩阵a的几个本征态(具有最小的本征值)感兴趣。就我所见,arpack使用了不同的方法,应该比LinearAlgebra包的完全对角化快得多。在我的示例中,为什么速度要慢得多 using LinearAlgebra, SparseArrays, Arpack A = sprand(5000,4995,0.01) # Matrix with 5-dimensional nullspace H = sparse(Hermitian(A*A')) @time E,

对于我的问题,我只对稀疏实对称矩阵a的几个本征态(具有最小的本征值)感兴趣。就我所见,arpack使用了不同的方法,应该比LinearAlgebra包的完全对角化快得多。在我的示例中,为什么速度要慢得多

using LinearAlgebra, SparseArrays, Arpack    
A = sprand(5000,4995,0.01) # Matrix with 5-dimensional nullspace
H = sparse(Hermitian(A*A'))
@time E, v  = eigen(Matrix(H))
@time E, v  = eigs(H, nev=10, which=:SM)

> 12.059152 seconds (27 allocations: 764.733 MiB, 0.72% gc time)
> 37.628222 seconds (680 allocations: 1.424 GiB, 0.47% gc time)

当使用
EIG
计算最小特征值时,有必要在算法的每次迭代中计算一些移位
λ
。在我们对
eigs
的实现中,这会导致每次迭代的
H-λ*I
的稀疏因子分解,而且成本很高。此外,与计算大值相比,计算最小值有时需要多次迭代,但我怀疑稀疏分解的成本占主导地位。您可以通过计算
而不是
:SM
来了解成本,因为前者只需要矩阵向量乘法