R: Estimate the Reciprocal Condition Number

rcond {Matrix} | R Documentation

## Estimate the Reciprocal Condition Number

### Description

Estimate the reciprocal of the condition number of a matrix.

This is a generic function with several methods, as seen by `showMethods(rcond)`.

### Usage

    rcond(x, norm, ...)

    ## S4 method for signature 'sparseMatrix,character'
    rcond(x, norm, useInv=FALSE, ...)

### Arguments

`x` | an R object that inherits from the `Matrix` class.
`norm` | character string indicating the type of norm to be used in the estimate. The default is `"O"` for the 1-norm (`"O"` is equivalent to `"1"`). For sparse matrices, when `useInv=TRUE`, `norm` can be any of the `kind`s allowed for `norm`; otherwise, the other possible value is `"I"` for the infinity norm, see also `norm`.
`useInv` | logical (or `"Matrix"` containing `solve(x)`). If not false, compute the reciprocal condition number as 1/(||x|| * ||x^(-1)||), where x^(-1) is the inverse of x, `solve(x)`. This may be an efficient alternative (only) in situations where `solve(x)` is fast (or known), e.g., for (very) sparse or triangular matrices. Note that the result may differ depending on `useInv`, as per default, when it is false, an approximation is computed.
`...` | further arguments passed to or from other methods.

### Value

An estimate of the reciprocal condition number of `x`.

### BACKGROUND

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.

### References

Golub, G., and Van Loan, C. F. (1989). Matrix Computations, 2nd edition, Johns Hopkins, Baltimore.

### See Also

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

### Examples

    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)))

[Package Matrix version 1.1-4 Index]