2017-03-22 7 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_jacobiancalc_pde_analytic_jacobian은 분석적 코비안 ( csc 포맷)의 희소 행렬을 구성한다. 분석 방법이 Jacobian의 희소 행렬을 구성하는 데 더 빠르게 작동하지만, 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 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 

: I는과 N = (1000, 150, 550 (50))의 범위에서 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 

및 (밀리 초 단위로 측정) 다음의 타이밍을 가지고 스파 스 솔버가 경쟁적으로되는 크기는 250-300입니다.

타이밍은 희소성 (즉, 매트릭스의 몇 퍼센트가 0이 아닌지)과 0이 아닌 요소의 구조 또는 패턴에 따라 달라질 수 있습니다. 문제가 발생하면 행렬이 512x512보다 커질 때까지는 희소 솔버가 좋지 않을 수 있습니다.