Функция linalg.lu
Функция linalg.lu выполняет LU-разложение квадратной или прямоугольной матрицы.
Она возвращает разложение в виде трёх тензоров: матрицы перестановок P,
нижней треугольной матрицы L и верхней треугольной матрицы U.
Разложение удовлетворяет равенству P @ A = L @ U.
Первым параметром функция принимает входную матрицу.
Вторым параметром можно указать, нужно ли возвращать матрицу перестановок.
Синтаксис
torch.linalg.lu(A, [pivot])
Пример
Давайте выполним LU-разложение квадратной матрицы размера 3x3:
import torch
A = torch.tensor([
[4.0, 3.0, 2.0],
[1.0, 2.0, 3.0],
[5.0, 4.0, 1.0],
])
P, L, U = torch.linalg.lu(A)
print("P:")
print(P)
print("L:")
print(L)
print("U:")
print(U)
Результат выполнения кода:
P:
tensor([
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.],
])
L:
tensor([
[1.0000, 0.0000, 0.0000],
[0.2000, 1.0000, 0.0000],
[0.8000, 0.5000, 1.0000],
])
U:
tensor([
[5.0000, 4.0000, 1.0000],
[0.0000, 1.2000, 2.8000],
[0.0000, 0.0000, 2.5000],
])
Пример
Проверим, что разложение корректно: P @ A = L @ U:
import torch
A = torch.tensor([
[4.0, 3.0, 2.0],
[1.0, 2.0, 3.0],
[5.0, 4.0, 1.0],
])
P, L, U = torch.linalg.lu(A)
res = torch.matmul(P, A)
res_lu = torch.matmul(L, U)
print(torch.allclose(res, res_lu))
Результат выполнения кода:
True
Пример
Выполним LU-разложение без возврата матрицы перестановок:
import torch
A = torch.tensor([
[2.0, 1.0],
[1.0, 2.0],
])
L, U = torch.linalg.lu(A, pivot=False)
print("L:")
print(L)
print("U:")
print(U)
Результат выполнения кода:
L:
tensor([
[1.0000, 0.0000],
[0.5000, 1.0000],
])
U:
tensor([
[2.0000, 1.0000],
[0.0000, 1.5000],
])
Пример
Выполним LU-разложение прямоугольной матрицы размера 3x2:
import torch
A = torch.tensor([
[1.0, 4.0],
[2.0, 5.0],
[3.0, 6.0],
])
P, L, U = torch.linalg.lu(A)
print("L shape:", L.shape)
print("U shape:", U.shape)
print("U:")
print(U)
Результат выполнения кода:
L shape: torch.Size([3, 2])
U shape: torch.Size([2, 2])
U:
tensor([
[3.0000, 6.0000],
[0.0000, 1.0000],
])