numpy.linalg.slogdet#

linalg.slogdet(a)[原始碼]#

計算陣列行列式的正負號和(自然)對數。

如果陣列的行列式非常小或非常大,則呼叫 det 可能會溢位或下溢。此常式對於這類問題更為穩健,因為它計算的是行列式的對數,而不是行列式本身。

參數:
a(…, M, M) 類陣列

輸入陣列,必須是方形 2 維陣列。

返回:
一個具名元組,包含以下屬性
sign(…) 類陣列

一個表示行列式正負號的數字。對於實數矩陣,這會是 1、0 或 -1。對於複數矩陣,這會是絕對值為 1 的複數(即在單位圓上),否則為 0。

logabsdet(…) 類陣列

行列式絕對值的自然對數。

如果行列式為零,則 sign 將為 0,且 logabsdet
將為 -inf。在所有情況下,行列式都等於
sign * np.exp(logabsdet).

另請參閱

det

註解

套用廣播規則,詳情請參閱 numpy.linalg 文件。

行列式是透過使用 LAPACK 常式 z/dgetrf 的 LU 分解計算得出。

範例

二維陣列 [[a, b], [c, d]] 的行列式為 ad - bc

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> (sign, logabsdet) = np.linalg.slogdet(a)
>>> (sign, logabsdet)
(-1, 0.69314718055994529) # may vary
>>> sign * np.exp(logabsdet)
-2.0

計算矩陣堆疊的對數行列式

>>> a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
>>> a.shape
(3, 2, 2)
>>> sign, logabsdet = np.linalg.slogdet(a)
>>> (sign, logabsdet)
(array([-1., -1., -1.]), array([ 0.69314718,  1.09861229,  2.07944154]))
>>> sign * np.exp(logabsdet)
array([-2., -3., -8.])

此常式在普通的 det 無法成功的情況下成功運作

>>> np.linalg.det(np.eye(500) * 0.1)
0.0
>>> np.linalg.slogdet(np.eye(500) * 0.1)
(1, -1151.2925464970228)