Python:复杂Hermitian矩阵的scipy.sparse.linalg.eigsh

时间:2014-07-31 14:35:33

标签: python scipy complex-numbers eigenvalue

我试图使用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,那么有谁知道这是什么意思?

注意:我知道这里的例子中的矩阵不一定是稀疏性的某些定义稀疏,但它仅用于说明目的。

0 个答案:

没有答案