diag {base} | R Documentation

## Matrix Diagonals

### Description

Extract or replace the diagonal of a matrix, or construct a diagonal matrix.

### Usage

    diag(x = 1, nrow, ncol = n)
    diag(x) <- value

### Arguments

`x` | a matrix, vector or 1D array.
`nrow, ncol` | Optional dimensions for the result.
`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 `x`.

### Value

If `x` is a matrix then `diag(x)` returns the diagonal of `x`. The resulting vector will have `names` if the matrix `x` has matching column and row names.
If `x` is a vector (or 1D array) of length two or more, then `diag(x)` returns a diagonal matrix whose diagonal is `x`.
If `x` is a vector of length one then `diag(x)` returns an identity matrix of order the nearest integer to `x`. The dimension of the returned matrix can be specified by `nrow` and `ncol` (the default is square).
The replacement form sets the diagonal of the matrix `x` to the given value(s).

### Note

Using `diag(x)` can have unexpected effects if `x` is a vector that could be of length one. Use `diag(x, nrow = length(x))` for consistent behaviour.

### References

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

### See Also

`upper.tri`, `lower.tri`, `matrix`.

### Examples

    require(stats)
    dim(diag(3))
    diag(10,3,4) # guess what?
    all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})

    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

[Package base version 2.3.1 Index]