2012-06-25 2 views
2

수치 계산을위한 파이썬 코드의 일부로, 다소 큰 (희소) 행렬 (~ 100x100)을 여러 번 뒤집어 야합니다. 프로그램을 빠르게하고 싶습니다. 그리고 나에게 제안 된 방법 중 하나는 행렬 반전 단계에서 C로 서브 루틴을 호출하는 것입니다.좋은 행렬 역변환 루틴 C

이 작업을 위해 효율적이고 잘 테스트 된 C 루틴이 있습니까?

감사합니다.

+2

당신이 NumPy와 + SciPy 모듈 봤어? – adelbertc

+0

예, NumPy는 실제로 제가 지금 사용하고있는 것입니다. 각 데이터 요소는 5 초 정도 소요됩니다. 너무 많은 속도가 느려서 많은 점이 필요할 것입니다. 나는 이미 NumPy가 상당히 효율적이라고 생각하지만 C와 같은 컴파일 된 언어에서 무언가를 호출하면 많은 시간을 절약 할 수있을 것이라고 읽었습니다. 당신의 의견에 감사드립니다! – AKC

+1

NumPy와 SciPy는 모두 C 및/또는 FORTRAN으로 작성된 시간이 중요한 루프를 많이 가지고 있습니다. C와 Python 인터페이스를 만드는 데 많은 경험이 없기 때문에 직접 작성하는 것에서 얼마나 개선 할 수 있는지 모르겠습니다. 반전은 값 비싼 계산이되는 경향이 있습니다. 즉, 인기있는 행렬 반전 알고리즘은 가우시안 제거 (Gaussian Elimination) 인 것으로 보입니다. – adelbertc

답변

2
>>> from numpy import * 
>>> from numpy.linalg import inv 
>>> from scipy.sparse import csr_matrix 
>>> m = matrix([[3,1,5],[1,0,8],[2,1,4]]) 
>>> s = csr_matrix(m) 
>>> invs = inv(a) # Inverse sparse matrix 
>>> dot(a,inva) # Check the result, should be eye(3) within machine precision 
csr_matrix([[ 1.00000000e-00, 2.77555756e-17, 3.60822483e-16], 
      [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], 
      [ -1.11022302e-16, 0.00000000e+00, 1.00000000e+00]]) 

정말로 필요한 역수입니까? 당신은 반전없이 목표를 달성 할 수 있습니다 : 당신이 정말이 역을 필요로

사례는 드물다. 또한 희소 행렬의 역함수가 반드시 희소하지는 않습니다. 일반적으로 반전은 LU 인수 분해보다 비용이 높으며 반올림 오류가 발생하기 쉽습니다.

-http://mail.scipy.org/pipermail/scipy-user/2007-October/013936.html

->http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.factorized.html#scipy.sparse.linalg.factorized