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) 類陣列

要分解的陣列

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 陣列,例如,以 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