# Symeig

Source:`R/gen-namespace-docs.R`

, `R/gen-namespace-examples.R`

, `R/gen-namespace.R`

`torch_symeig.Rd`

Symeig

## Arguments

- self
(Tensor) the input tensor of size \((*, n, n)\) where

`*`

is zero or more batch dimensions consisting of symmetric matrices.- eigenvectors
(boolean, optional) controls whether eigenvectors have to be computed

- upper
(boolean, optional) controls whether to consider upper-triangular or lower-triangular region

## Note

The eigenvalues are returned in ascending order. If `input`

is a batch of matrices,
then the eigenvalues of each matrix in the batch is returned in ascending order.

Irrespective of the original strides, the returned matrix `V`

will
be transposed, i.e. with strides `V.contiguous().transpose(-1, -2).stride()`

.

Extra care needs to be taken when backward through outputs. Such
operation is really only stable when all eigenvalues are distinct.
Otherwise, `NaN`

can appear as the gradients are not properly defined.

## symeig(input, eigenvectors=False, upper=TRUE) -> (Tensor, Tensor)

This function returns eigenvalues and eigenvectors
of a real symmetric matrix `input`

or a batch of real symmetric matrices,
represented by a namedtuple (eigenvalues, eigenvectors).

This function calculates all eigenvalues (and vectors) of `input`

such that \(\mbox{input} = V \mbox{diag}(e) V^T\).

The boolean argument `eigenvectors`

defines computation of
both eigenvectors and eigenvalues or eigenvalues only.

If it is `FALSE`

, only eigenvalues are computed. If it is `TRUE`

,
both eigenvalues and eigenvectors are computed.

Since the input matrix `input`

is supposed to be symmetric,
only the upper triangular portion is used by default.

If `upper`

is `FALSE`

, then lower triangular portion is used.

## Examples

```
if (torch_is_installed()) {
a = torch_randn(c(5, 5))
a = a + a$t() # To make a symmetric
a
o = torch_symeig(a, eigenvectors=TRUE)
e = o[[1]]
v = o[[2]]
e
v
a_big = torch_randn(c(5, 2, 2))
a_big = a_big + a_big$transpose(-2, -1) # To make a_big symmetric
o = a_big$symeig(eigenvectors=TRUE)
e = o[[1]]
v = o[[2]]
torch_allclose(torch_matmul(v, torch_matmul(e$diag_embed(), v$transpose(-2, -1))), a_big)
}
#> [1] TRUE
```