scipy.linalg.

lu#

scipy.linalg.lu(a, permute_l=False, overwrite_a=False, check_finite=True, p_indices=False)[source]#

计算矩阵的 LU 分解,并进行部分主元选择。

分解满足以下公式

A = P @ L @ U

其中 P 是一个置换矩阵,L 是对角线元素为 1 的下三角矩阵,U 是上三角矩阵。如果 permute_l 设置为 True,那么 L 会被返回,并进行置换,因此满足 A = L @ U

参数::
a(M, N) array_like

要分解的数组

permute_lbool, 可选

执行乘法 P*L(默认:不置换)

overwrite_abool, 可选

是否覆盖 a 中的数据(可能提高性能)

check_finitebool, 可选

是否检查输入矩阵中是否只包含有限数值。禁用可能提高性能,但如果输入包含无穷大或 NaN,可能会导致问题(崩溃、不终止)。

p_indicesbool, 可选

如果 True,则置换信息将以行索引的形式返回。默认值为 False,以保持向后兼容性。

返回值::
(如果 `permute_l` 为 ``False``)
p(…, M, M) ndarray

置换数组或向量,具体取决于 p_indices

l(…, M, K) ndarray

对角线元素为 1 的下三角或梯形数组。 K = min(M, N)

u(…, K, N) ndarray

上三角或梯形数组

(如果 `permute_l` 为 ``True``)
pl(…, M, K) ndarray

置换后的 L 矩阵。 K = min(M, N)

u(…, K, N) ndarray

上三角或梯形数组

注意

置换矩阵的成本很高,因为它们只是 L 的行重新排序,因此如果需要置换,强烈建议使用索引代替。在二维情况下,关系简化为 A = L[P, :] @ U。在更高维度的情况下,最好使用 permute_l 来避免复杂的索引技巧。

在二维情况下,如果由于某种原因,仍然需要置换矩阵,可以使用 np.eye(M)[P, :] 来构造它。

例子

>>> import numpy as np
>>> from scipy.linalg import lu
>>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
>>> p, l, u = lu(A)
>>> np.allclose(A, p @ l @ u)
True
>>> p  # Permutation matrix
array([[0., 1., 0., 0.],  # Row index 1
       [0., 0., 0., 1.],  # Row index 3
       [1., 0., 0., 0.],  # Row index 0
       [0., 0., 1., 0.]]) # Row index 2
>>> p, _, _ = lu(A, p_indices=True)
>>> p
array([1, 3, 0, 2])  # as given by row indices above
>>> np.allclose(A, l[p, :] @ u)
True

我们也可以使用 nd 数组,例如,一个使用 4D 数组的演示

>>> rng = np.random.default_rng()
>>> A = rng.uniform(low=-4, high=4, size=[3, 2, 4, 8])
>>> p, l, u = lu(A)
>>> p.shape, l.shape, u.shape
((3, 2, 4, 4), (3, 2, 4, 4), (3, 2, 4, 8))
>>> np.allclose(A, p @ l @ u)
True
>>> PL, U = lu(A, permute_l=True)
>>> np.allclose(A, PL @ U)
True