% File src/library/base/man/eigen.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2016 R Core Team
% Distributed under GPL 2 or later

\name{eigen}
\alias{eigen}
\alias{print.eigen}
\concept{eigen vector}
\concept{eigen value}
\title{Spectral Decomposition of a Matrix}
\description{
  Computes eigenvalues and eigenvectors of numeric (double, integer,
  logical) or complex matrices.
}
\usage{
eigen(x, symmetric, only.values = FALSE, EISPACK = FALSE)
}
\arguments{
  \item{x}{a numeric or complex matrix whose spectral decomposition is to
    be computed.  Logical matrices are coerced to numeric.}
  \item{symmetric}{if \code{TRUE}, the matrix is assumed to be symmetric
    (or Hermitian if complex) and only its lower triangle (diagonal
    included) is used.  If \code{symmetric} is not specified,
    \code{\link{isSymmetric}(x)} is used.}
  \item{only.values}{if \code{TRUE}, only the eigenvalues are computed
    and returned, otherwise both eigenvalues and eigenvectors are
    returned.}
  \item{EISPACK}{logical. Defunct and ignored.}
}
\details{
  If \code{symmetric} is unspecified, \code{\link{isSymmetric}(x)}
  determines if the matrix is symmetric up to plausible numerical
  inaccuracies.  It is surer and typically much faster to set the value
  yourself.

  Computing the eigenvectors is the slow part for large matrices.

  Computing the eigendecomposition of a matrix is subject to errors on a
  real-world computer: the definitive analysis is Wilkinson (1965).  All
  you can hope for is a solution to a problem suitably close to
  \code{x}.  So even though a real asymmetric \code{x} may have an
  algebraic solution with repeated real eigenvalues, the computed
  solution may be of a similar matrix with complex conjugate pairs of
  eigenvalues.

  Unsuccessful results from the underlying LAPACK code will result in an
  error giving a positive error code (most often \code{1}): these can
  only be interpreted by detailed study of the FORTRAN code.
}
\value{
  The spectral decomposition of \code{x} is returned as a list with components

  \item{values}{a vector containing the \eqn{p} eigenvalues of \code{x},
    sorted in \emph{decreasing} order, according to \code{Mod(values)}
    in the asymmetric case when they might be complex (even for real
    matrices).  For real asymmetric matrices the vector will be
    complex only if complex conjugate pairs of eigenvalues are detected.
  }
  \item{vectors}{either a \eqn{p\times p}{p * p} matrix whose columns
    contain the eigenvectors of \code{x}, or \code{NULL} if
    \code{only.values} is \code{TRUE}.  The vectors are normalized to
    unit length.

    Recall that the eigenvectors are only defined up to a constant: even
    when the length is specified they are still only defined up to a
    scalar of modulus one (the sign for real matrices).
  }

  When \code{only.values} is not true, as by default, the result is of
  S3 class \code{"eigen"}.

  If \code{r <- eigen(A)}, and \code{V <- r$vectors; lam <- r$values},
  then \deqn{A = V \Lambda V^{-1}}{A = V Lmbd V^(-1)} (up to numerical
  fuzz), where \eqn{\Lambda =}{Lmbd =}\code{diag(lam)}.
}
\source{
  \code{eigen} uses the LAPACK routines \code{DSYEVR}, \code{DGEEV},
  \code{ZHEEV} and \code{ZGEEV}.

  LAPACK is from \url{http://www.netlib.org/lapack} and its guide is listed
  in the references.
}
\references{
  Anderson. E. and ten others (1999)
  \emph{LAPACK Users' Guide}.  Third Edition.  SIAM.\cr
  Available on-line at
  \url{http://www.netlib.org/lapack/lug/lapack_lug.html}.

  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.

  Wilkinson, J. H. (1965) \emph{The Algebraic Eigenvalue Problem.}
  Clarendon Press, Oxford.
}

\seealso{
  \code{\link{svd}}, a generalization of \code{eigen}; \code{\link{qr}}, and
  \code{\link{chol}} for related decompositions.

  To compute the determinant of a matrix, the \code{\link{qr}}
  decomposition is much more efficient: \code{\link{det}}.
}
\examples{
eigen(cbind(c(1,-1), c(-1,1)))
eigen(cbind(c(1,-1), c(-1,1)), symmetric = FALSE)
# same (different algorithm).

eigen(cbind(1, c(1,-1)), only.values = TRUE)
eigen(cbind(-1, 2:1)) # complex values
eigen(print(cbind(c(0, 1i), c(-1i, 0)))) # Hermite ==> real Eigenvalues
## 3 x 3:
eigen(cbind( 1, 3:1, 1:3))
eigen(cbind(-1, c(1:2,0), 0:2)) # complex values

}
\keyword{algebra}
\keyword{array}
