Rate this Page

torch.linalg.eig#

torch.linalg.eig(A,*,out=None)#

Computes the eigenvalue decomposition of a square matrix if it exists.

LettingK\mathbb{K} beR\mathbb{R} orC\mathbb{C},theeigenvalue decomposition of a square matrixAKn×nA \in \mathbb{K}^{n \times n} (if it exists) is defined as

This decomposition exists if and only ifAA isdiagonalizable.This is the case when all its eigenvalues are different.

Supports input of float, double, cfloat and cdouble dtypes.Also supports batches of matrices, and ifA is a batch of matrices thenthe output has the same batch dimensions.

The returned eigenvalues are not guaranteed to be in any specific order.

Note

The eigenvalues and eigenvectors of a real matrix may be complex.

Note

When inputs are on a CUDA device, this function synchronizes that device with the CPU.

Warning

This function assumes thatA isdiagonalizable (for example, when all theeigenvalues are different). If it is not diagonalizable, the returnedeigenvalues will be correct butAVdiag(Λ)V1A \neq V \operatorname{diag}(\Lambda)V^{-1}.

Warning

The returned eigenvectors are normalized to have norm1.Even then, the eigenvectors of a matrix are not unique, nor are they continuous with respect toA. Due to this lack of uniqueness, different hardware and software may computedifferent eigenvectors.

This non-uniqueness is caused by the fact that multiplying an eigenvector bybyeiϕ,ϕRe^{i \phi}, \phi \in \mathbb{R} produces another set of valid eigenvectorsof the matrix. For this reason, the loss function shall not depend on the phase of theeigenvectors, as this quantity is not well-defined.This is checked when computing the gradients of this function. As such,when inputs are on a CUDA device, the computation of the gradientsof this function synchronizes that device with the CPU.

Warning

Gradients computed using theeigenvectors tensor will only be finite whenA has distinct eigenvalues.Furthermore, if the distance between any two eigenvalues is close to zero,the gradient will be numerically unstable, as it depends on the eigenvaluesλi\lambda_i through the computation of1minijλiλj\frac{1}{\min_{i \neq j} \lambda_i - \lambda_j}.

See also

torch.linalg.eigvals() computes only the eigenvalues.Unliketorch.linalg.eig(), the gradients ofeigvals() are alwaysnumerically stable.

torch.linalg.eigh() for a (faster) function that computes the eigenvalue decompositionfor Hermitian and symmetric matrices.

torch.linalg.svd() for a function that computes another type of spectraldecomposition that works on matrices of any shape.

torch.linalg.qr() for another (much faster) decomposition that works on matrices ofany shape.

Parameters

A (Tensor) – tensor of shape(*, n, n) where* is zero or more batch dimensionsconsisting of diagonalizable matrices.

Keyword Arguments

out (tuple,optional) – output tuple of two tensors. Ignored ifNone. Default:None.

Returns

A named tuple(eigenvalues, eigenvectors) which corresponds toΛ\Lambda andVV above.

eigenvalues andeigenvectors will always be complex-valued, even whenA is real. The eigenvectorswill be given by the columns ofeigenvectors.

Examples:

>>>A=torch.randn(2,2,dtype=torch.complex128)>>>Atensor([[ 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)>>>Ltensor([ 1.1226+0.5738j, -0.7537-0.1286j], dtype=torch.complex128)>>>Vtensor([[ 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)