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