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) array_like
Массив для разложения
- permute_lbool, необязательно
Выполнить умножение P*L (по умолчанию: не переставлять)
- overwrite_abool, необязательно
Перезаписывать ли данные в a (может улучшить производительность)
- check_finitebool, необязательно
Проверять ли, что входная матрица содержит только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, незавершению) если входные данные содержат бесконечности или NaN.
- p_indicesbool, необязательно
Если
Trueинформация о перестановке возвращается как индексы строк. По умолчаниюFalseпо причинам обратной совместимости.
- Возвращает:
- (Если `permute_l` равно ``False``)
- p(..., M, M) ndarray
Массивы или векторы перестановок в зависимости от p_indices
- l(…, M, K) ndarray
Нижняя треугольная или трапециевидная матрица с единичной диагональю.
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и поэтому настоятельно рекомендуется использовать индексы вместо этого, если требуется перестановка. Соотношение в 2D случае тогда становится просто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], dtype=int32) # as given by row indices above >>> np.allclose(A, l[p, :] @ u) True
Мы также можем использовать n-мерные массивы, например, демонстрация с 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