在Python中计算稀疏矩阵的广义特征值。

3
我正在使用scipy.sparse.linalg.eigsh来解决一个非常稀疏的矩阵的广义特征值问题,并遇到了内存问题。该矩阵是一个具有100万行/列的方阵,但每行只有大约25个非零条目。是否有一种方法可以解决问题,而无需将整个矩阵读入内存,即只在内存中处理矩阵块?
如果解决方案涉及使用Python或Java中的其他库,则可以接受。

很遗憾,看起来你已经在使用ARPACK了。你可能需要转向ARPACK的FORTRAN实现,或者使用ARPACK++来获得所需的细粒度内存控制... - brentlance
你尝试过Shift-invert mode吗?此外,你真的需要所有的特征值吗(你可以只计算最大值)? - lucasg
1个回答

3
对于ARPACK,您只需要编写一个计算特定矩阵-向量乘积的程序。这可以以任何您喜欢的方式实现,例如从磁盘读取矩阵。
from scipy.sparse.linalg import LinearOperator

def my_matvec(x):
    y = compute matrix-vector product A x
    return y

A = LinearOperator(matvec=my_matvec, shape=(1000000, 1000000))
scipy.sparse.linalg.eigsh(A)

请查看scipy.sparse.linalg.eigsh文档以了解广义特征值问题所需的内容。

Scipy ARPACK接口几乎暴露了完整的ARPACK接口,因此我怀疑您通过切换到FORTRAN或其他访问Arpack的方式不会获得太多好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接