2017-03-22 171 views
3

我有一个奇怪的现象,虽然scipy.sparse.linalg.eigs对于稀疏矩阵应该更快,但我得到它比正常的eigvals方法scipy更慢:稀疏特征值:scipy.sparse.linalg.eigs比scipy.linalg.eigvals更慢

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_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) 

任何人都知道这是怎么发生的呢?

+1

矩阵的大小是多少? –

+0

当前矩阵的大小是512x512 – Ohm

回答

1

对于足够大和稀疏的矩阵,稀疏求解器应该更快。我跑下面的片段为N的范围(150,550,50)和N = 1000:

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。