行列方程式を解く(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を構成するソースを調べる。