我试图使用python的scipy.sparse.linalg.eigsh函数对一个简单的稀疏Hermitian矩阵进行对角化;虽然the documentation表示它支持Hermitian矩阵,但文件python包装文件arpack.py表示它不支持:
#ARPACK的入口点是
# - (s,d)seupd:单精度和双精度对称矩阵
# - (s,d,c,z)neupd:单,双,复,双复一般矩阵
#这个包装器将* neupd(通用矩阵)接口放在eigs()
中#和eigsh()中的* seupd(对称矩阵)。
#没有Hermetian复杂/双复杂界面。
#要查找Hermetian矩阵的特征值
#必须使用eigs()而不是eigsh()
#可能需要以不同方式处理Hermetian案件
#和,例如,返回实际特征值。
当我尝试运行以下代码以使用eigsh对稀疏复杂Hermitian矩阵进行对角化时,来自包装器的上述注释是正确的:
from scipy.sparse import *
from scipy.sparse.linalg import *
import math
sign = lambda x: math.copysign(1, x)
S = lil_matrix((5,5), dtype=complex)
for i in range(5):
for j in range(5):
S[i,j] = sign(i-j)*1j
eigval = eigsh(-S, k=1, M=None,sigma=None, which='LM', v0=None, ncv=None, tol=0, return_eigenvectors=False)
然后出现以下错误:
ValueError:输入矩阵不是实数值。
当然,如果我对S和numpy.linalg.eigh函数使用常规numpy矩阵,则计算所有特征值。但是
我不想要所有的特征值,
我需要我的矩阵稀疏。
如果不能使用稀疏复杂Hermitian矩阵的稀疏版本eigsh,那么有谁知道这是什么意思?
注意:我知道这里的例子中的矩阵不一定是稀疏性的某些定义稀疏,但它仅用于说明目的。