2017-03-22 6 views
3

scipy.sparse.linalg.eigsが速くスパース行列のためでなければなりませんけれども、私は、特有の現象を持っているよりも遅いですが、私はそれがscipyの通常eigvals方法よりも遅く動作することを取得します:スパース固有値: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形式)ヤコビのスパース行列を構築します。分析法は、ヤコビ行列の疎行列を構成する上でより速く動作するが、擬似からの固有値発見法を用いるとき、疎行列の固有値法はより遅い。固有値を計算するために使用する関数は次のとおりです。

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

:私の範囲で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 

及び(ミリ秒で測定)以下のタイミングを得スパースソルバが競合するサイズは250〜300です。

タイミングは希薄さ(すなわち、マトリックスの何パーセントが非ゼロであるか)および非ゼロ要素の構造またはパターンに依存する可能性が高い。あなたの問題では、行列が512x512より大きくなるまでスパースソルバは良くないかもしれません。

関連する問題