當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。