numpy.linalg.slogdet

linalg.slogdet(a)[源代码]

计算数组行列式的符号和(自然)对数。

如果数组的行列式非常小或非常大,则调用 det 可能溢出或下溢。这个程序对这些问题更为强大,因为它计算行列式的对数而不是行列式本身。

参数
a(…,m,m)数组类

输入数组,必须是方形二维数组。

返回
sign(…)类似数组

表示行列式符号的数。对于实矩阵,这是1、0或-1。对于复杂矩阵,这是一个绝对值为1的复数(即,它在单位圆上),否则为0。

logdet(…)类似数组

行列式绝对值的自然对数。

如果行列式为零,那么 sign 将是0和 logdet
-在所有情况下,行列式等于 sign * np.exp(logdet) .

参见

det

笔记

1.8.0 新版功能.

广播规则适用,见 numpy.linalg 有关详细信息的文档。

1.6.0 新版功能.

行列式是使用LAPACK程序通过LU分解计算的 z/dgetrf .

实例

二维数组的行列式 [[a, b], [c, d]]ad - bc

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

计算矩阵堆栈的对数行列式:

>>> a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
>>> a.shape
(3, 2, 2)
>>> sign, logdet = np.linalg.slogdet(a)
>>> (sign, logdet)
(array([-1., -1., -1.]), array([ 0.69314718,  1.09861229,  2.07944154]))
>>> sign * np.exp(logdet)
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)