scipy.linalg.
lu#
- scipy.linalg.lu(a, permute_l=False, overwrite_a=False, check_finite=True, p_indices=False)[源代码]#
计算具有部分主元的矩阵的 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
对角线为单位的下三角或梯形数组。
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], dtype=int32) # as given by row indices above >>> np.allclose(A, l[p, :] @ u) True
我们也可以使用 nd-arrays,例如,一个 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