簡體   English   中英

稀疏特征值:scipy.sparse.linalg.eigs比scipy.linalg.eigvals慢

[英]Sparse eigenvalues : scipy.sparse.linalg.eigs is slower than scipy.linalg.eigvals

我有一個奇特的現象,雖然scipy.sparse.linalg.eigs應該是稀疏矩陣快,我得到它的運行速度比正常情況下慢eigvals的方法scipy

In [4]: %timeit m.calc_pde_numerical_jacobian(m.initial_state)
10 loops, best of 3: 41.2 ms per loop

In [5]: %timeit m.calc_pde_analytic_jacobian(m.initial_state)
1000 loops, best of 3: 1.42 ms per loop

In [6]: %timeit m.calc_analytic_pde_eigs(m.initial_state)
1 loop, best of 3: 374 ms per loop

In [7]: %timeit m.calc_numeric_pde_eigs(m.initial_state)
1 loop, best of 3: 256 ms per loop 

因此方法calc_pde_numerical_jacobian構造了我的方程組雅可比calc_pde_numerical_jacobian的密集矩陣, calc_pde_analytic_jacobian正在構造雅可比分析的稀疏矩陣( csc格式)。 雖然分析方法在構造雅可比矩陣的稀疏矩陣方面工作得更快,但當使用scipy的特征值求解方法時,稀疏矩陣特征值方法較慢。 我用來計算特征值的函數是這樣的:

def calc_numeric_pde_eigs(self,state):
    return linalg.eigvals(self.calc_pde_numerical_jacobian(state))
def calc_analytic_pde_eigs(self,state):
    return sparse.linalg.eigs(self.calc_pde_analytic_jacobian(state),k=6,which='LR',return_eigenvectors=False)

誰知道這會怎么樣?

對於足夠大和稀疏的矩陣,稀疏求解器應該更快。 我在范圍(150,550,50)和N = 1000中為N運行以下代碼段:

In [150]: from scipy import sparse

In [151]: from scipy import linalg

[...]

In [186]: N = 150

In [187]: m = sparse.random(N, N, density=0.05).tocsc()

In [188]: a = m.A

In [189]: %timeit sparse.linalg.eigs(m, k=6, which='LR', return_eigenvectors=False)
10 loops, best of 3: 20.2 ms per loop

In [190]: %timeit linalg.eigvals(a)
100 loops, best of 3: 9.66 ms per loop

得到以下時間(以毫秒為單位):

N                    150   200   250   300   350   400   450   500   1000
sparse.linalg.eig   20.2  22.2  28.9  29.4  48.5  38.6  75.2   57.9   152
linalg.eigvals       9.7  17.0  24.5  37.0  52.7  63.3  82.5  105     482

在這種情況下,稀疏求解器變得有競爭力的大小為250-300。

時間可能取決於稀疏性(即矩陣的百分比是非零的)以及非零元素的結構或模式。 對於您的問題,在矩陣大於512x512之前,稀疏求解器可能不會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM