blob: c02e626a30022631c58a6baecf07de626fee8c04 [file] [log] [blame]
% File src/library/base/man/diag.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2017 R Core Team
% Distributed under GPL 2 or later
\name{diag}
\title{Matrix Diagonals}
\usage{
diag(x = 1, nrow, ncol, names = TRUE)
diag(x) <- value
}
\alias{diag}
\alias{diag<-}
\description{
Extract or replace the diagonal of a matrix,
or construct a diagonal matrix.
}
\arguments{
\item{x}{a matrix, vector or 1D \code{\link{array}}, or missing.}
\item{nrow, ncol}{optional dimensions for the result when \code{x} is
not a matrix.}
\item{names}{(when \code{x} is a matrix) logical indicating if the
resulting vector, the diagonal of \code{x}, should inherit
\code{\link{names}} from \code{dimnames(x)} if available.}
\item{value}{either a single value or a vector of length equal to that
of the current diagonal. Should be of a mode which can be coerced
to that of \code{x}.}
}
\details{
\code{diag} has four distinct usages:
\enumerate{
\item \code{x} is a matrix, when it extracts the diagonal.
\item \code{x} is missing and \code{nrow} is specified, it returns
an identity matrix.
\item \code{x} is a scalar (length-one vector) and the only
argument, it returns a square identity matrix of size given by the scalar.
\item \code{x} is a \sQuote{numeric} (\code{\link{complex}},
\code{numeric}, \code{integer}, \code{\link{logical}}, or
\code{\link{raw}}) vector, either of length at least 2 or there
were further arguments. This returns a matrix with the given
diagonal and zero off-diagonal entries.
}
It is an error to specify \code{nrow} or \code{ncol} in the first case.
}
\value{
If \code{x} is a matrix then \code{diag(x)} returns the diagonal of
\code{x}. The resulting vector will have \code{\link{names}} if the
matrix \code{x} has matching column and rownames.
The replacement form sets the diagonal of the matrix \code{x} to the
given value(s).
In all other cases the value is a diagonal matrix with \code{nrow}
rows and \code{ncol} columns (if \code{ncol} is not given the matrix
is square). Here \code{nrow} is taken from the argument if specified,
otherwise inferred from \code{x}: if that is a vector (or 1D array) of
length two or more, then its length is the number of rows, but if it
is of length one and neither \code{nrow} nor \code{ncol} is specified,
\code{nrow = as.integer(x)}.
When a diagonal matrix is returned, the diagonal elements are one
except in the fourth case, when \code{x} gives the diagonal elements:
it will be recycled or truncated as needed, but fractional recycling
and truncation will give a warning.
}
\note{
Using \code{diag(x)} can have unexpected effects if \code{x} is a
vector that could be of length one. Use \code{diag(x, nrow =
length(x))} for consistent behaviour.
}
\references{
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
\emph{The New S Language}.
Wadsworth & Brooks/Cole.
}
\seealso{
\code{\link{upper.tri}}, \code{\link{lower.tri}}, \code{\link{matrix}}.
}
\examples{
dim(diag(3))
diag(10, 3, 4) # guess what?
all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})
## other "numeric"-like diagonal matrices :
diag(c(1i,2i)) # complex
diag(TRUE, 3) # logical
diag(as.raw(1:3)) # raw
(D2 <- diag(2:1, 4)); typeof(D2) # "integer"
require(stats)
## diag(<var-cov-matrix>) = variances
diag(var(M <- cbind(X = 1:5, Y = rnorm(5))))
#-> vector with names "X" and "Y"
rownames(M) <- c(colnames(M), rep("", 3))
M; diag(M) # named as well
diag(M, names = FALSE) # w/o names
\dontshow{stopifnot(identical(names(diag(M)), colnames(M)),
is.null(names(diag(M, names=FALSE))),
is.null(names(diag(var(M), names=FALSE)))) }
}
\keyword{array}