计算二维实对称矩阵的特征值和特征向量的最快方法是什么
Whats the fastest way to calculate the eigenvalues and eigenvectors of a 2D real symetrical Matrix
除了
之外,还有没有更快的方法来计算二维实对称矩阵的特征值和特征向量?
N = 10101
S = np.random.random((N,N))
S = (S + S.T)/2
eigenValues, eigenVectors = np.linalg.eig(S)
idx = eigenValues.argsort()[::-1]
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]
这对我来说太长了
我会使用 np.linalg.eigh
,因为它是为实对称矩阵设计的,并且会使用特殊算法。另一个好处是返回的特征值按升序排序,因此您不需要使用 argsort()
.
与 N = 1010
的速度比较,所以我不会永远等待:
eig_vals, eig_vects = np.linalg.eig(S)
# 628 ms ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
eig_vals, eig_vects = np.linalg.eigh(S)
# 89.1 ms ± 2.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
from scipy import linalg as la
eig_vals, eig_vects = la.eigh(S)
# 346 ms ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
np.linalg.eigh
是迄今为止最快的。
除了
之外,还有没有更快的方法来计算二维实对称矩阵的特征值和特征向量?N = 10101
S = np.random.random((N,N))
S = (S + S.T)/2
eigenValues, eigenVectors = np.linalg.eig(S)
idx = eigenValues.argsort()[::-1]
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]
这对我来说太长了
我会使用 np.linalg.eigh
,因为它是为实对称矩阵设计的,并且会使用特殊算法。另一个好处是返回的特征值按升序排序,因此您不需要使用 argsort()
.
与 N = 1010
的速度比较,所以我不会永远等待:
eig_vals, eig_vects = np.linalg.eig(S)
# 628 ms ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
eig_vals, eig_vects = np.linalg.eigh(S)
# 89.1 ms ± 2.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
from scipy import linalg as la
eig_vals, eig_vects = la.eigh(S)
# 346 ms ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
np.linalg.eigh
是迄今为止最快的。