行列方程式を解く(3)
前回使ったsolveモジュールの中を内容を確認する。
from numpy.linalg import solve
とimportした。
手元のLinuxでは、以下のディレクトリにlinalg.pyファイルがある。
/usr/local/lib/python2.5/site-packages/numpy/linalg/
その中の一部で関数solveが定義されている。
from numpy.linalg import lapack_lite ... def solve(a, b): """Return the solution of a*x = b """ one_eq = len(b.shape) == 1 if one_eq: b = b[:, newaxis] _assertRank2(a, b) _assertSquareness(a) n_eq = a.shape[0] n_rhs = b.shape[1] if n_eq != b.shape[0]: raise LinAlgError, 'Incompatible dimensions' t, result_t = _commonType(a, b) # lapack_routine = _findLapackRoutine('gesv', t) if isComplexType(t): lapack_routine = lapack_lite.zgesv else: lapack_routine = lapack_lite.dgesv a, b = _fastCopyAndTranspose(t, a, b) pivots = zeros(n_eq, fortran_int) results = lapack_routine(n_eq, n_rhs, a, n_eq, pivots, b, n_eq, 0) if results['info'] > 0: raise LinAlgError, 'Singular matrix' if one_eq: return b.ravel().astype(result_t) else: return b.transpose().astype(result_t) ...
ここで呼ばれているlapack_liteはどこで定義されているのか。同じディレクトリにlapack_lite.soファイル発見。このファイルを
from numpy.linalg import lapack_lite
の部分でリンクしている(?)のか。こんなことができるのだなー。できるのか?そもそもnumpy.linalgってのもよくわかっていない。自分の理解がまだまだ甘いということがわかった。
- やること
- モジュールのimportの原理を復習する。
- lapack_liteを構成するソースを調べる。