Функция linalg.eigh
Функция torch.linalg.eigh вычисляет собственные значения и собственные векторы для эрмитовых (самосопряженных) матриц. Для вещественных матриц это эквивалентно симметричным матрицам. Функция возвращает кортеж (eigenvalues, eigenvectors), где собственные значения упорядочены по возрастанию. Первым параметром передается тензор матрицы, вторым - строка UPLO, которая указывает, какую часть матрицы использовать (верхнюю или нижнюю треугольную).
Синтаксис
torch.linalg.eigh(input, UPLO='L', *, out=None)
Параметры
input (Tensor) - входная эрмитова (симметричная) матрица или пакет матриц размерностью (*, n, n), где * - любое количество пакетных измерений.
UPLO (str, опционально) - указывает, какую часть матрицы использовать для вычислений: 'L' (нижняя треугольная, по умолчанию) или 'U' (верхняя треугольная). Остальная часть матрицы игнорируется.
out (tuple, опционально) - кортеж из двух тензоров для записи результата. Если передан, то функция не создает новые тензоры, а записывает результат в переданные.
Пример с матрицей 2x2
Рассмотрим простейший пример вычисления собственных значений и векторов для симметричной матрицы 2x2:
import torch
t = torch.tensor([
[1.0, 2.0],
[2.0, 1.0],
])
values, vectors = torch.linalg.eigh(t)
print("Собственные значения:")
print(values)
print("Собственные векторы:")
print(vectors)
Результат выполнения кода:
Собственные значения:
tensor([-1., 3.])
Собственные векторы:
tensor([[-0.7071, 0.7071],
[ 0.7071, 0.7071]])
Пример с матрицей 3x3
Выполним вычисления для симметричной матрицы 3x3:
import torch
t = torch.tensor([
[4.0, 1.0, 2.0],
[1.0, 3.0, 1.0],
[2.0, 1.0, 5.0],
])
values, vectors = torch.linalg.eigh(t)
print("Собственные значения:")
print(values)
print("Собственные векторы:")
print(vectors)
Результат выполнения кода:
Собственные значения:
tensor([1.7321, 4.0000, 6.2679])
Собственные векторы:
tensor([[-0.5734, -0.4082, 0.7104],
[ 0.7523, -0.8165, 0.1683],
[-0.3250, 0.4082, 0.6835]])
Пример с использованием верхней треугольной части
При использовании параметра UPLO='U' функция будет использовать верхнюю треугольную часть матрицы:
import torch
t = torch.tensor([
[3.0, 1.0],
[1.0, 3.0],
])
values, vectors = torch.linalg.eigh(t, UPLO='U')
print("Собственные значения:")
print(values)
print("Собственные векторы:")
print(vectors)
Результат выполнения кода:
Собственные значения:
tensor([2., 4.])
Собственные векторы:
tensor([[-0.7071, 0.7071],
[ 0.7071, 0.7071]])
Пример с пакетом матриц
Функция linalg.eigh поддерживает пакетные вычисления для нескольких матриц одновременно:
import torch
t = torch.tensor([
[
[2.0, 0.0],
[0.0, 2.0],
],
[
[1.0, 1.0],
[1.0, 1.0],
],
])
values, vectors = torch.linalg.eigh(t)
print("Собственные значения (пакет):")
print(values)
print("Собственные векторы (пакет):")
print(vectors)
Результат выполнения кода:
Собственные значения (пакет):
tensor([[2., 2.],
[0., 2.]])
Собственные векторы (пакет):
tensor([[[1., 0.],
[0., 1.]],
[[-0.7071, 0.7071],
[ 0.7071, 0.7071]]])