torch.linalg.eigh
-
torch.linalg.eigh(A, UPLO='L', *, out=None) -
Вычисляет разложение по собственным значениям комплексной эрмитовой или вещественной симметричной матрицы.
Пусть будет или . Разложение по собственным значениям комплексной эрмитовой или вещественной симметричной матрицы определяется как
где — сопряжённый транспонированный, если комплексный, и транспонированный, если вещественный. ортогонален в вещественном случае и унитарный в комплексном случае.
Поддерживает входные типы float, double, cfloat и cdouble. Также поддерживает пакетные матрицы; если
A— пакет матриц, то выход имеет те же размерности пакета.Aпредполагается эрмитовой (соответственно, симметричной), но это не проверяется внутри, вместо этого:- Если
UPLO= ‘L’(по умолчанию), в вычислениях используется только нижняя треугольная часть матрицы. - Если
UPLO= ‘U’, используется только верхняя треугольная часть матрицы.
Собственные значения возвращаются в порядке возрастания.
Примечание
При вводе на устройстве CUDA эта функция синхронизирует это устройство с процессором.
Примечание
Собственные значения вещественных симметричных или комплексных эрмитовых матриц всегда вещественные.
Предупреждение
Собственные векторы симметричной матрицы не уникальны и не непрерывны относительно
A. Из-за этого отсутствия уникальности разное аппаратное и программное обеспечение могут вычислять разные собственные векторы.Это отсутствие уникальности обусловлено тем, что умножение собственного вектора на
-1в вещественном случае или на в комплексном случае даёт другой набор допустимых собственных векторов матрицы. По этой причине функция потерь не должна зависеть от фазы собственных векторов, поскольку эта величина не определена. Это проверяется для комплексных входных данных при вычислении градиентов этой функции. Таким образом, когда входные данные комплексные и находятся на устройстве CUDA, вычисление градиентов этой функции синхронизирует это устройство с процессором.Предупреждение
Градиенты, вычисленные с использованием
eigenvectorsтензора, будут конечными только тогда, когдаAимеет различные собственные значения. Кроме того, если расстояние между любыми двумя собственными значениями близко к нулю, градиент будет числово неустойчивым, поскольку он зависит от собственных значений через вычисление .См. также
torch.linalg.eigvalsh()вычисляет только собственные значения эрмитовой матрицы. В отличие отtorch.linalg.eigh(), градиентыeigvalsh()всегда числово устойчивы.torch.linalg.cholesky()для другого разложения эрмитовой матрицы. Разложение Холецкого даёт меньше информации о матрице, но вычисляется намного быстрее, чем разложение по собственным значениям.torch.linalg.eig()для (медленной) функции, вычисляющей разложение по собственным значениям не обязательно эрмитовой квадратной матрицы.torch.linalg.svd()для (медленной) функции, вычисляющей более общее разложение SVD матриц любой формы.torch.linalg.qr()для другого (значительно более быстрого) разложения, работающего с общими матрицами.- Параметры:
-
-
A (Tensor) – тензор формы
(*, n, n), где*— одна или более размерности пакета, состоящие из симметричных или эрмитовых матриц. -
UPLO ('L', 'U', необязательно) – управляет тем, использовать ли верхнюю или нижнюю треугольную часть
Aв вычислениях. По умолчанию:‘L’.
-
A (Tensor) – тензор формы
- Ключевые аргументы:
-
out (tuple, необязательно) – кортеж из двух тензоров для вывода. Игнорируется, если
None. По умолчанию:None. - Возвращает:
-
Именованный кортеж
(eigenvalues, eigenvectors), который соответствует и выше.eigenvaluesвсегда будет вещественным, даже еслиAкомплексный. Он также будет отсортирован в порядке возрастания.eigenvectorsбудет иметь тот же тип данных, что иA, и будет содержать собственные векторы в качестве своих столбцов.
- Примеры::
-
>>> A = torch.randn(2, 2, dtype=torch.complex128) >>> A = A + A.T.conj() # creates a Hermitian matrix >>> A tensor([[2.9228+0.0000j, 0.2029-0.0862j], [0.2029+0.0862j, 0.3464+0.0000j]], dtype=torch.complex128) >>> L, Q = torch.linalg.eigh(A) >>> L tensor([0.3277, 2.9415], dtype=torch.float64) >>> Q tensor([[-0.0846+-0.0000j, -0.9964+0.0000j], [ 0.9170+0.3898j, -0.0779-0.0331j]], dtype=torch.complex128) >>> torch.dist(Q @ torch.diag(L.cdouble()) @ Q.T.conj(), A) tensor(6.1062e-16, dtype=torch.float64)>>> A = torch.randn(3, 2, 2, dtype=torch.float64) >>> A = A + A.mT # creates a batch of symmetric matrices >>> L, Q = torch.linalg.eigh(A) >>> torch.dist(Q @ torch.diag_embed(L) @ Q.mH, A) tensor(1.5423e-15, dtype=torch.float64)
- Если
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/generated/torch.linalg.eigh.html