lu_factor#
- scipy.linalg.lu_factor(a, overwrite_a=False, check_finite=True)[Quelle]#
Berechnet die pivotierte LU-Zerlegung einer Matrix.
Die Zerlegung ist
A = P L U
wobei P eine Permutationsmatrix, L eine untere Dreiecksmatrix mit Einheiten auf der Diagonalen und U eine obere Dreiecksmatrix ist.
Die Dokumentation wurde unter der Annahme verfasst, dass die Array-Argumente bestimmte „Kern“-Formen haben. Array-Argumente dieser Funktion können jedoch zusätzliche „Batch“-Dimensionen vorangestellt haben. In diesem Fall wird das Array als Stapel von niedrigdimensionalen Schnitten behandelt; siehe Gestapelte lineare Operationen für Details.
- Parameter:
- a(M, N) array_like
Zu zerlegende Matrix
- overwrite_abool, optional
Ob die Daten in A überschrieben werden sollen (kann die Leistung steigern)
- check_finitebool, optional
Ob überprüft werden soll, ob die Eingabematrix nur endliche Zahlen enthält. Das Deaktivieren kann zu einer Leistungssteigerung führen, kann aber zu Problemen (Abstürze, Nichtterminierung) führen, wenn die Eingaben Unendlichkeiten oder NaNs enthalten.
- Rückgabe:
- lu(M, N) ndarray
Matrix, die U in ihrem oberen Dreieck und L in ihrem unteren Dreieck enthält. Die Einheiten auf der Diagonalen von L werden nicht gespeichert.
- piv(K,) ndarray
Pivot-Indizes, die die Permutationsmatrix P darstellen: Zeile i der Matrix wurde mit Zeile piv[i] vertauscht. Von der Form
(K,), mitK = min(M, N).
Siehe auch
Hinweise
Dies ist ein Wrapper für die
*GETRFRoutinen von LAPACK. Im Gegensatz zulugibt es die L- und U-Faktoren in einer einzigen Array aus und gibt Pivot-Indizes anstelle einer Permutationsmatrix zurück.Während die zugrundeliegenden
*GETRFRoutinen 1-basierte Pivot-Indizes zurückgeben, enthält das vonlu_factorzurückgegebenepivArray 0-basierte Indizes.Beispiele
>>> import numpy as np >>> from scipy.linalg import lu_factor >>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]]) >>> lu, piv = lu_factor(A) >>> piv array([2, 2, 3, 3], dtype=int32)
Konvertieren des LAPACK-Pivot-Arrays in NumPy-Indizes und Testen der Permutation
>>> def pivot_to_permutation(piv): ... perm = np.arange(len(piv)) ... for i in range(len(piv)): ... perm[i], perm[piv[i]] = perm[piv[i]], perm[i] ... return perm ... >>> p_inv = pivot_to_permutation(piv) >>> p_inv array([2, 0, 3, 1]) >>> L, U = np.tril(lu, k=-1) + np.eye(4), np.triu(lu) >>> np.allclose(A[p_inv] - L @ U, np.zeros((4, 4))) True
Die Matrix P in P L U wird durch die inverse Permutation definiert und kann mit argsort wiederhergestellt werden
>>> p = np.argsort(p_inv) >>> p array([1, 3, 0, 2]) >>> np.allclose(A - L[p] @ U, np.zeros((4, 4))) True
oder alternativ
>>> P = np.eye(4)[p] >>> np.allclose(A - P @ L @ U, np.zeros((4, 4))) True