【发布时间】:2018-03-02 21:10:15
【问题描述】:
我有一个由 Python 代码计算的 NxN 对称和三对角矩阵,我想将它对角化。
在特定情况下,我正在处理N = 6000,但矩阵可以变得更大。由于它是稀疏的,我认为对角化它的最佳方法是使用算法scipy.sparse.linalg.eigsh(),它在我使用的其他稀疏和对称矩阵(但不是三对角矩阵)中表现得非常好。特别是,由于我只需要频谱的低位部分,因此我在函数中指定了 k=2 和 which='SM'。
但是,在这种情况下,该算法似乎不起作用,因为经过大约 20 分钟的计算后,我收到以下错误:
ArpackNoConvergence:ARPACK 错误 -1:没有收敛(60001 次迭代,0/2 特征向量收敛)
为什么会这样?这是与三对角矩阵的某些属性有关的问题吗?为了以有效的方式对角化我的矩阵,我可以使用哪个 Python(请只使用 Python!)例程?
这是重现我的错误所需的最少代码:
import scipy.sparse.linalg as sl
import numpy as np
dim = 6000
a = np.empty( dim - 1 )
a.fill( 1. )
diag_up = np.diag( a, 1 )
diag_bot = np.diag( a, -1 )
b = np.empty( dim )
b.fill( 1. )
mat = np.diag( b ) + diag_up + diag_bot
v, w = sl.eigsh(mat, 2, which = 'SM')
在我的电脑上,矩阵的构建需要 364 毫秒,而对角化给出了报告的错误。
【问题讨论】:
-
您能提供一个最小的工作示例吗?选角会不会有问题?
scipy.sparse函数适用于稀疏数组,它们在内存中具有不同的表示形式,也许您所观察到的与此有关?您是否尝试过分析您的代码? -
您可能会发现this 非常有用。 O(nlogn) 岩石
-
@norok2 完成,感谢您的回答。
-
如果这对你有用,我会坚持使用
scipy.linalg.eigh()。不知道为什么函数在这种情况下不收敛。 -
@norok 抱歉回答迟了。 scipy.linalg.eigh() 对我来说已经足够快了,谢谢。
标签: python numpy matrix scipy linear-algebra