APIはまだ存在しませんが、低レベルのLAPACK ?POTRI
ルーチンファミリを使用することができます。
Docstring:
inv_a,info = dpotri(c,[lower,overwrite_c])
Wrapper for ``dpotri``.
Parameters
----------
c : input rank-2 array('d') with bounds (n,n)
Other Parameters
----------------
overwrite_c : input int, optional
Default: 0
lower : input int, optional
Default: 0
Returns
-------
inv_a : rank-2 array('d') with bounds (n,n) and c storage
info : int
Call signature: sp.linalg.lapack.dpotri(*args, **kwargs)
最も重要なのはinfo
出力され、次のように
sp.linalg.lapack.dpotri
のドキュメント文字列です。それがゼロであれば、正の確定性にかかわらず、式を成功裏に解くことを意味する。これは低レベル呼び出しであるため、他のチェックは実行されません。
>>>> M = np.random.rand(10,10)
>>>> M = M + M.T
>>>> # Make it pos def
>>>> M += (1.5*np.abs(np.min(np.linalg.eigvals(M))) + 1) * np.eye(10)
>>>> zz , _ = sp.linalg.lapack.dpotrf(M, False, False)
>>>> inv_M , info = sp.linalg.lapack.dpotri(zz)
>>>> # lapack only returns the upper or lower triangular part
>>>> inv_M = np.triu(inv_M) + np.triu(inv_M, k=1).T
また、あなたがスピード
>>>> %timeit sp.linalg.lapack.dpotrf(M)
The slowest run took 17.86 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.15 µs per loop
>>>> %timeit sp.linalg.lapack.dpotri(M)
The slowest run took 24.09 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.08 µs per loop
>>>> III = np.eye(10)
>>>> %timeit sp.linalg.solve(M,III, sym_pos=1,overwrite_b=1)
10000 loops, best of 3: 40.6 µs per loop
を比較するのであれば、あなたはかなり無視できない速利益を得ます。複素数で作業している場合は、代わりにzpotri
を使用する必要があります。
質問はあなたが逆を必要とするかどうかです。 solve(B,A)
がそれに適しているため、B⁻¹ * A
を計算する必要がある場合はおそらくありません。
'?SY'系は、複素数値のものを含む対称行列用です。 hermitian行列のために '' HE'ファミリーが必要です。存在しない点に関しては、APIだけが欠落している。 LAPACKの機能の大部分はすぐそこに来ています。 – percusse