Spec-Zone.ru › PyTorch 2.14

torch.linalg.eig

torch.linalg.eig(A, *, out=None) [источник]

Вычисляет разложение квадратной матрицы на собственные значения и собственные векторы, если оно существует.

Пусть K\mathbb{K} — это R\mathbb{R} или C\mathbb{C}. Тогда разложение на собственные значения и собственные векторы квадратной матрицы A∈Kn×nA \in \mathbb{K}^{n \times n} (если оно существует) определяется как

A=Vdiag⁡(Λ)V−1V∈Cn×n,Λ∈CnA = V \operatorname{diag}(\Lambda) V^{-1}\mathrlap{\qquad V \in \mathbb{C}^{n \times n}, \Lambda \in \mathbb{C}^n}

Это разложение существует тогда и только тогда, когда AA диагонализируема. Это выполняется, когда все её собственные значения различны.

Поддерживаются входные данные типов float, double, cfloat и cdouble. Также поддерживаются пакеты матриц; если A — это пакет матриц, выходные данные имеют те же размерности пакета.

Порядок возвращаемых собственных значений не гарантируется.

Примечание

Собственные значения и собственные векторы вещественной матрицы могут быть комплексными.

Примечание

Если входные данные находятся на устройстве CUDA, эта функция синхронизирует это устройство с CPU.

Предупреждение

Эта функция предполагает, что A диагонализируема (например, если все собственные значения различны). Если матрица не диагонализируема, возвращаемые собственные значения будут верными, но A≠Vdiag⁡(Λ)V−1A \neq V \operatorname{diag}(\Lambda)V^{-1}.

Предупреждение

Возвращаемые собственные векторы нормализованы так, чтобы их норма равнялась 1. Даже в этом случае собственные векторы матрицы не являются единственными и не меняются непрерывно относительно A. Из-за этой неоднозначности на разных аппаратных и программных платформах могут вычисляться разные собственные векторы.

Эта неоднозначность обусловлена тем, что умножение собственного вектора на eiϕ,ϕ∈Re^{i \phi}, \phi \in \mathbb{R} даёт другой набор допустимых собственных векторов матрицы. Поэтому функция потерь не должна зависеть от фазы собственных векторов, поскольку эта величина не определена однозначно. Это проверяется при вычислении градиентов данной функции. Таким образом, если входные данные находятся на устройстве CUDA, вычисление градиентов этой функции синхронизирует это устройство с CPU.

Предупреждение

Градиенты, вычисляемые с использованием тензора eigenvectors, будут конечными только в том случае, если A имеет различные собственные значения. Кроме того, если расстояние между любыми двумя собственными значениями близко к нулю, градиент будет численно неустойчивым, поскольку он зависит от собственных значений λi\lambda_i через вычисление 1min⁡i≠jλi−λj\frac{1}{\min_{i \neq j} \lambda_i - \lambda_j}.

См. также

torch.linalg.eigvals() вычисляет только собственные значения. В отличие от torch.linalg.eig(), градиенты eigvals() всегда численно устойчивы.

torch.linalg.eigh() — более быстрая функция для вычисления разложения на собственные значения и собственные векторы эрмитовых и симметричных матриц.

torch.linalg.svd() — функция для вычисления другого типа спектрального разложения, применимого к матрицам любой формы.

torch.linalg.qr() — ещё одно (гораздо более быстрое) разложение, применимое к матрицам любой формы.

Параметры:

A (Tensor) – тензор формы (*, n, n), где * — ноль или более пакетных размерностей, содержащих диагонализируемые матрицы.

Именованные аргументы:

out (tuple, необязательный) – выходной кортеж из двух тензоров. Игнорируется, если None. Значение по умолчанию: None.

Возвращает:

Именованный кортеж (eigenvalues, eigenvectors), соответствующий приведённым выше Λ\Lambda и VV.

eigenvalues и eigenvectors всегда будут комплексными, даже если A — вещественная матрица. Собственные векторы представлены столбцами eigenvectors.

Примеры:

>>> A = torch.randn(2, 2, dtype=torch.complex128)
>>> A
tensor([[ 0.9828+0.3889j, -0.4617+0.3010j],
        [ 0.1662-0.7435j, -0.6139+0.0562j]], dtype=torch.complex128)
>>> L, V = torch.linalg.eig(A)
>>> L
tensor([ 1.1226+0.5738j, -0.7537-0.1286j], dtype=torch.complex128)
>>> V
tensor([[ 0.9218+0.0000j,  0.1882-0.2220j],
        [-0.0270-0.3867j,  0.9567+0.0000j]], dtype=torch.complex128)
>>> torch.dist(V @ torch.diag(L) @ torch.linalg.inv(V), A)
tensor(7.7119e-16, dtype=torch.float64)

>>> A = torch.randn(3, 2, 2, dtype=torch.float64)
>>> L, V = torch.linalg.eig(A)
>>> torch.dist(V @ torch.diag_embed(L) @ torch.linalg.inv(V), A)
tensor(3.2841e-16, dtype=torch.float64)

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.linalg.eig.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API