我正在使用 scipy.sparse.linalg.eigsh 来解决非常稀疏矩阵的广义特征值问题并遇到内存问题。该矩阵是一个有 100 万行/列的方阵,但每行只有大约 25 个非零条目。有没有办法在不将整个矩阵读入内存的情况下解决问题,即一次只处理内存中的矩阵块?
如果解决方案涉及在 python 或 java 中使用不同的库,那没关系。
我正在使用 scipy.sparse.linalg.eigsh 来解决非常稀疏矩阵的广义特征值问题并遇到内存问题。该矩阵是一个有 100 万行/列的方阵,但每行只有大约 25 个非零条目。有没有办法在不将整个矩阵读入内存的情况下解决问题,即一次只处理内存中的矩阵块?
如果解决方案涉及在 python 或 java 中使用不同的库,那没关系。
对于 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 获得很多。