rcond {Matrix} | R Documentation |
Estimate the reciprocal of the condition number of a matrix.
This is a generic function with several methods, as seen by
showMethods(rcond)
.
rcond(x, norm, ...) ## S4 method for signature 'sparseMatrix,character' rcond(x, norm, useInv=FALSE, ...)
x |
an R object that inherits from the |
norm |
character string indicating the type of norm to be used in
the estimate. The default is |
useInv |
logical (or This may be an efficient alternative (only) in situations where
Note that the result may differ depending on |
... |
further arguments passed to or from other methods. |
An estimate of the reciprocal condition number of x
.
The condition number of a regular (square) matrix is the product of
the norm
of the matrix and the norm of its inverse (or
pseudo-inverse).
More generally, the condition number is defined (also for non-square matrices A) as
kappa(A) = (max_(||v|| = 1; || Av ||)) /(min_(||v|| = 1; || Av ||)).
Whenever x
is not a square matrix, in our method
definitions, this is typically computed via rcond(qr.R(qr(X)), ...)
where X
is x
or t(x)
.
The condition number takes on values between 1 and infinity, inclusive, and can be viewed as a factor by which errors in solving linear systems with this matrix as coefficient matrix could be magnified.
rcond()
computes the reciprocal condition number
1/κ with values in [0,1] and can be viewed as a
scaled measure of how close a matrix is to being rank deficient (aka
“singular”).
Condition numbers are usually estimated, since exact computation is costly in terms of floating-point operations. An (over) estimate of reciprocal condition number is given, since by doing so overflow is avoided. Matrices are well-conditioned if the reciprocal condition number is near 1 and ill-conditioned if it is near zero.
Golub, G., and Van Loan, C. F. (1989). Matrix Computations, 2nd edition, Johns Hopkins, Baltimore.
norm
, kappa()
from package
base computes an approximate condition number of a
“traditional” matrix, even non-square ones, with respect to the
p=2 (Euclidean) norm
.
solve
.
condest
, a newer approximate estimate of
the (1-norm) condition number, particularly efficient for large sparse
matrices.
x <- Matrix(rnorm(9), 3, 3) rcond(x) ## typically "the same" (with more computational effort): 1 / (norm(x) * norm(solve(x))) rcond(Hilbert(9)) # should be about 9.1e-13 ## For non-square matrices: rcond(x1 <- cbind(1,1:10))# 0.05278 rcond(x2 <- cbind(x1, 2:11))# practically 0, since x2 does not have full rank ## sparse (S1 <- Matrix(rbind(0:1,0, diag(3:-2)))) rcond(S1) m1 <- as(S1, "denseMatrix") all.equal(rcond(S1), rcond(m1)) ## wide and sparse rcond(Matrix(cbind(0, diag(2:-1)))) ## Large sparse example ---------- m <- Matrix(c(3,0:2), 2,2) M <- bdiag(kronecker(Diagonal(2), m), kronecker(m,m)) 36*(iM <- solve(M)) # still sparse MM <- kronecker(Diagonal(10), kronecker(Diagonal(5),kronecker(m,M))) dim(M3 <- kronecker(bdiag(M,M),MM)) # 12'800 ^ 2 if(interactive()) ## takes about 2 seconds if you have >= 8 GB RAM system.time(r <- rcond(M3)) ## whereas this is *fast* even though it computes solve(M3) system.time(r. <- rcond(M3, useInv=TRUE)) if(interactive()) ## the values are not the same c(r, r.) # 0.05555 0.013888 ## for all 4 norms available for sparseMatrix : cbind(rr <- sapply(c("1","I","F","M"), function(N) rcond(M3, norm=N, useInv=TRUE)))