Schur: Schur Decomposition of a Matrix In Matrix: Sparse and Dense Matrix Classes and Methods

 Schur R Documentation

Schur Decomposition of a Matrix

Description

Computes the Schur decomposition and eigenvalues of a square matrix; see the BACKGROUND information below.

Usage

```Schur(x, vectors, ...)
```

Arguments

 `x` numeric square Matrix (inheriting from class `"Matrix"`) or traditional `matrix`. Missing values (NAs) are not allowed. `vectors` logical. When `TRUE` (the default), the Schur vectors are computed, and the result is a proper `MatrixFactorization` of class `Schur`. `...` further arguments passed to or from other methods.

Details

Based on the Lapack subroutine `dgees`.

Value

If `vectors` are `TRUE`, as per default: If `x` is a `Matrix` an object of class `Schur`, otherwise, for a traditional `matrix` `x`, a `list` with components `T`, `Q`, and `EValues`.

If `vectors` are `FALSE`, a list with components

 `T` the upper quasi-triangular (square) matrix of the Schur decomposition. `EValues` the vector of `numeric` or `complex` eigen values of T or A.

BACKGROUND

If `A` is a square matrix, then `A = Q T t(Q)`, where `Q` is orthogonal, and `T` is upper block-triangular (nearly triangular with either 1 by 1 or 2 by 2 blocks on the diagonal) where the 2 by 2 blocks correspond to (non-real) complex eigenvalues. The eigenvalues of `A` are the same as those of `T`, which are easy to compute. The Schur form is used most often for computing non-symmetric eigenvalue decompositions, and for computing functions of matrices such as matrix exponentials.

References

Anderson, E., et al. (1994). LAPACK User's Guide, 2nd edition, SIAM, Philadelphia.

Examples

```Schur(Hilbert(9))              # Schur factorization (real eigenvalues)

(A <- Matrix(round(rnorm(5*5, sd = 100)), nrow = 5))
(Sch.A <- Schur(A))

eTA <- eigen(Sch.A@T)
str(SchA <- Schur(A, vectors=FALSE))# no 'T' ==> simple list
stopifnot(all.equal(eTA\$values, eigen(A)\$values, tolerance = 1e-13),
all.equal(eTA\$values,
local({z <- Sch.A@EValues
z[order(Mod(z), decreasing=TRUE)]}), tolerance = 1e-13),
identical(SchA\$T, Sch.A@T),
identical(SchA\$EValues, Sch.A@EValues))

## For the faint of heart, we provide Schur() also for traditional matrices:

a.m <- function(M) unname(as(M, "matrix"))
a <- a.m(A)
Sch.a <- Schur(a)
stopifnot(identical(Sch.a, list(Q = a.m(Sch.A @ Q),
T = a.m(Sch.A @ T),
EValues = Sch.A@EValues)),
all.equal(a, with(Sch.a, Q %*% T %*% t(Q)))
)
```

Matrix documentation built on Nov. 11, 2022, 9:06 a.m.