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.5.0

Index]