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)
.
另請參閱
註解
套用廣播規則,詳情請參閱
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)