Schur(x, vectors, ...)
"Matrix"
) or traditional
matrix
. Missing values (NAs) are not allowed.TRUE
(the default), the Schur
vectors are computed, and the result is a proper
MatrixFactorization
of class
Schur
.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
numeric
or
complex
eigen values of $T$ or $A$.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.dgees
.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)))
)
Run the code above in your browser using DataLab