当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy linalg.lu用法及代码示例


本文简要介绍 python 语言中 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具有单位对角线元素的下三角形,以及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

返回

(If `permute_l` is ``False``)
p (…, M, M) ndarray

取决于 p_indices 的排列数组或向量

l (…, M, K) ndarray

具有单位对角线的下三角或梯形阵列。 K = min(M, N)

u (…, K, N) ndarray

上三角或梯形阵列

(If `permute_l` is ``True``)
pl (…, M, K) ndarray

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

u (…, K, N) ndarray

上三角或梯形阵列

注意

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

在 2D 情况下,如果有索引,但由于某种原因,仍然需要置换矩阵,则可以通过 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-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

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.lu。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。