torch.symeig¶
-
torch.symeig(input, eigenvectors=False, upper=True, *, out=None)¶ This function returns eigenvalues and eigenvectors of a real symmetric matrix
inputor a batch of real symmetric matrices, represented by a namedtuple (eigenvalues, eigenvectors).This function calculates all eigenvalues (and vectors) of
inputsuch that .The boolean argument
eigenvectorsdefines computation of both eigenvectors and eigenvalues or eigenvalues only.If it is
False, only eigenvalues are computed. If it isTrue, both eigenvalues and eigenvectors are computed.Since the input matrix
inputis supposed to be symmetric, only the upper triangular portion is used by default.If
upperisFalse, then lower triangular portion is used.Note
The eigenvalues are returned in ascending order. If
inputis a batch of matrices, then the eigenvalues of each matrix in the batch is returned in ascending order.Note
Irrespective of the original strides, the returned matrix V will be transposed, i.e. with strides V.contiguous().transpose(-1, -2).stride().
Note
Extra care needs to be taken when backward through outputs. Such operation is really only stable when all eigenvalues are distinct. Otherwise,
NaNcan appear as the gradients are not properly defined.- Parameters
- Keyword Arguments
out (tuple, optional) – the output tuple of (Tensor, Tensor)
- Returns
A namedtuple (eigenvalues, eigenvectors) containing
eigenvalues (Tensor): Shape . The eigenvalues in ascending order.
eigenvectors (Tensor): Shape . If
eigenvectors=False, it’s an empty tensor. Otherwise, this tensor contains the orthonormal eigenvectors of theinput.
- Return type
Examples:
>>> a = torch.randn(5, 5) >>> a = a + a.t() # To make a symmetric >>> a tensor([[-5.7827, 4.4559, -0.2344, -1.7123, -1.8330], [ 4.4559, 1.4250, -2.8636, -3.2100, -0.1798], [-0.2344, -2.8636, 1.7112, -5.5785, 7.1988], [-1.7123, -3.2100, -5.5785, -2.6227, 3.1036], [-1.8330, -0.1798, 7.1988, 3.1036, -5.1453]]) >>> e, v = torch.symeig(a, eigenvectors=True) >>> e tensor([-13.7012, -7.7497, -2.3163, 5.2477, 8.1050]) >>> v tensor([[ 0.1643, 0.9034, -0.0291, 0.3508, 0.1817], [-0.2417, -0.3071, -0.5081, 0.6534, 0.4026], [-0.5176, 0.1223, -0.0220, 0.3295, -0.7798], [-0.4850, 0.2695, -0.5773, -0.5840, 0.1337], [ 0.6415, -0.0447, -0.6381, -0.0193, -0.4230]]) >>> a_big = torch.randn(5, 2, 2) >>> a_big = a_big + a_big.transpose(-2, -1) # To make a_big symmetric >>> e, v = a_big.symeig(eigenvectors=True) >>> torch.allclose(torch.matmul(v, torch.matmul(e.diag_embed(), v.transpose(-2, -1))), a_big) True