R: Rank of a Matrix

rankMatrix {Matrix} | R Documentation

## Rank of a Matrix

### Description

Compute the rank of matrix, a well-defined functional in theory, somewhat ambigous in practice. We provide several methods, the default corresponding to Matlab's definition.

### Usage

    rankMatrix(x, tol = NULL,
               method = c("tolNorm2", "qrLINPACK", "useGrad", "maybeGrad"),
               sval = svd(x, 0, 0)$d)

### Arguments

`x` | numeric matrix, of dimension n x m, say.
`tol` | nonnegative number specifying a tolerance for “practically zero” with specific meaning depending on `method`; by default, `max(dim(x)) * .Machine$double.eps * abs(max(sval))` is according to Matlab's default (for its only `method` "tolNorm2").
`method` | a character string specifying the computational method, can be abbreviated: tolNorm2 the number of singular values `>= tol`; qrLINPACK this is the rank of `qr(x, tol, LAPACK=FALSE)`, which is `qr(...)$rank` for a dense matrix, and the rank of R for sparse `x` (where `qr` uses a "sparseQR" method, see `qr-methods`, and not LINPACK). This used to be the recommended way to compute a matrix rank for a while in the past. For this method, `sval` are not used (nor computed). useGrad considering the “gradient” of the (decreasing) singular values, the index of the smallest gap. maybeGrad choosing method `"useGrad"` only when that seems reasonable; otherwise using `"tolNorm2"`.
`sval` | numeric vector of non-increasing singular values of `x`; typically unspecified and computed from `x`.

### Value

positive integer in `1:min(dim(x))`, with attributes detailing the method used.

### Author(s)

Martin Maechler; for the "*Grad" methods, building on suggestions by Ravi Varadhan.

### See Also

`qr`, `svd`.

### Examples

    rankMatrix(cbind(1, 0, 1:3)) # 2

    (meths <- eval(formals(rankMatrix)$method))

    ## a "border" case:
    H12 <- Hilbert(12)
    rankMatrix(H12, tol = 1e-20) # 12;  but  11  with default method & tol.
    sapply(meths, function(.m.) rankMatrix(H12, method = .m.))
    ## tolNorm2 qrLINPACK   useGrad maybeGrad
    ##       11        12        11        11

    ## "sparse" case:
    M15 <- kronecker(diag(x=c(100,1,10)), Hilbert(5))
    sapply(meths, function(.m.) rankMatrix(M15, method = .m.))
    #--> all 15, but 'useGrad' has 14.

[Package Matrix version 1.0-6 Index]