# qr-methods: QR Decomposition - S4 Methods and Generic

Description Usage Arguments Methods See Also Examples

### Description

The `"Matrix"` package provides methods for the QR decomposition of special classes of matrices. There is a generic function which uses `qr` as default, but methods defined in this package can take extra arguments. In particular there is an option for determining a fill-reducing permutation of the columns of a sparse, rectangular matrix.

### Usage

 ```1 2``` ```qr(x, ...) qrR(qr, complete=FALSE, backPermute=TRUE, row.names = TRUE) ```

### Arguments

 `x` a numeric or complex matrix whose QR decomposition is to be computed. Logical matrices are coerced to numeric. `qr` a QR decomposition of the type computed by `qr`. `complete` logical indicating whether the \bold{R} matrix is to be completed by binding zero-value rows beneath the square upper triangle. `backPermute` logical indicating if the rows of the \bold{R} matrix should be back permuted such that `qrR()`'s result can be used directly to reconstruct the original matrix \bold{X}. `row.names` logical indicating if `rownames` should propagated to the result. `...` further arguments passed to or from other methods

### Methods

x = "dgCMatrix"

QR decomposition of a general sparse double-precision matrix with `nrow(x) >= ncol(x)`. Returns an object of class `"sparseQR"`.

x = "sparseMatrix"

works via `"dgCMatrix"`.

`qr`; then, the class documentations, mainly `sparseQR`, and also `dgCMatrix`.

### Examples

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64``` ```##------------- example of pivoting -- from base' qraux.Rd ------------- X <- Matrix(cbind(int = 1, b1=rep(1:0, each=3), b2=rep(0:1, each=3), c1=rep(c(1,0,0), 2), c2=rep(c(0,1,0), 2), c3=rep(c(0,0,1),2)), sparse=TRUE) rownames(X) <- paste0("r", seq_len(nrow(X))) dnX <- dimnames(X) X # is singular, columns "b2" and "c3" are "extra" c(rankMatrix(X)) # = 4 (not 6) ##----- regular case ------------------------------------------ Xr <- X[ , -c(3,6)] # the "regular" (non-singular) version of X stopifnot(rankMatrix(Xr) == ncol(Xr)) Y <- cbind(y <- setNames(1:6, paste0("y", 1:6))) ## regular case: m <- as.matrix qXr <- qr( Xr) qxr <- qr(m(Xr)) qcfXy <- qr.coef (qXr, y) qcfXY <- qr.coef (qXr, Y) stopifnot( all.equal(qr.coef(qxr, y), cf <- c(int=6, b1=-3, c1=-2, c2=-1), tol=1e-15) , all.equal(qr.coef(qxr, Y), as.matrix(cf), tol=1e-15) , all.equal(unname(qcfXy), unname(cf), tol=1e-15) || # FAIL names: ## FIXME_______ all.equal(qcfXy, cf, tol=1e-15) , all.equal(unname(m(qcfXY)), unname(m(cf)), tol=1e-15) || # FAIL dimnames: ## FIXME_______ all.equal(m(qcfXY), m(cf), tol=1e-15) , all.equal(y, qr.fitted(qxr, y), tol=2e-15) , all.equal(y, qr.fitted(qXr, y), tol=2e-15) , all.equal(m(qr.fitted(qXr, Y)), qr.fitted(qxr, Y), tol=1e-15) , all.equal( qr.resid (qXr, y), qr.resid (qxr, y), tol=1e-15) , all.equal(m(qr.resid (qXr, Y)), qr.resid (qxr, Y), tol=1e-15) ) ##----- singular case ----------------------------------------------- (qX <- qr( X)) qx <- qr(m(X)) # both @p and @q are non-trivial permutations stopifnot(identical(dimnames(X), dnX))# some versions changed X's dimnames! drop0(R. <- qr.R(qX), tol=1e-15) # columns *permuted*: c3 b1 .. Q. <- qr.Q(qX) qI <- sort.list(qX@q) # the inverse 'q' permutation (X. <- drop0(Q. %*% R.[, qI], tol=1e-15))## just = X, incl. correct colnames stopifnot(all(X - X.) < 8*.Machine\$double.eps, ## qrR(.) returns R already "back permuted" (as with qI): identical(R.[, qI], qrR(qX)) ) ## ## In this sense, classical qr.coef() is fine: cfqx <- qr.coef(qx, y) # quite different from nna <- !is.na(cfqx) stopifnot(all.equal(unname(qr.fitted(qx,y)), as.numeric(X[,nna] %*% cfqx[nna]))) ## FIXME: do these make *any* sense? --- should give warnings ! qr.coef(qX, y) qr.coef(qX, Y) rm(m) ```

Search within the Matrix package
Search all R packages, documentation and source code

Questions? Problems? Suggestions? or email at ian@mutexlabs.com.

Please suggest features or report bugs with the GitHub issue tracker.

All documentation is copyright its authors; we didn't write any of that.