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) 数组类型
- 要分解的数组 
- permute_l布尔型,可选
- 执行 P*L 的乘法 (默认:不置换) 
- overwrite_a布尔型,可选
- 是否覆盖数组 a 中的数据 (可能提升性能) 
- check_finite布尔型,可选
- 是否检查输入矩阵仅包含有限数。禁用此选项可能会提高性能,但如果输入包含无穷大或 NaN 值,则可能导致问题(崩溃、无法终止)。 
- p_indices布尔型,可选
- 如果为 - 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], 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