R: Reconstruct the Q, R, or X Matrices from a QR Object

QR.Auxiliaries {base} | R Documentation

## Reconstruct the Q, R, or X Matrices from a QR Object

### Description

Returns the original matrix from which the object was constructed or the components of the decomposition.

### Usage

    qr.X(qr, complete = FALSE, ncol =)
    qr.Q(qr, complete = FALSE, Dvec =)
    qr.R(qr, complete = FALSE, ...)

### Arguments

`qr` | object representing a QR decomposition. This will typically have come from a previous call to `qr` or `lsfit`.
`complete` | logical expression of length 1. Indicates whether an arbitrary orthogonal completion of the \bold{Q} or \bold{X} matrices is to be made, or whether the \bold{R} matrix is to be completed by binding zero-value rows beneath the square upper triangle.
`ncol` | integer in the range `1:nrow(qr$qr)`. The number of columns to be in the reconstructed \bold{X}. The default when `complete` is `FALSE` is the first `min(ncol(X), nrow(X))` columns of the original \bold{X} from which the qr object was constructed. The default when `complete` is `TRUE` is a square matrix with the original \bold{X} in the first `ncol(X)` columns and an arbitrary orthogonal completion (unitary completion in the complex case) in the remaining columns.
`Dvec` | vector (not matrix) of diagonal values. Each column of the returned \bold{Q} will be multiplied by the corresponding diagonal value. Defaults to all `1`s.
`...` | potentially further arguments, passed potentially to non-default methods.

### Value

`qr.X` returns \bold{X}, the original matrix from which the qr object was constructed, provided `ncol(X) <= nrow(X)`. If `complete` is `TRUE` or the argument `ncol` is greater than `ncol(X)`, additional columns from an arbitrary orthogonal (unitary) completion of `X` are returned.

`qr.Q` returns part or all of Q, the order-nrow(X) orthogonal (unitary) transformation represented by `qr`. If `complete` is `TRUE`, Q has `nrow(X)` columns. If `complete` is `FALSE`, Q has `ncol(X)` columns. When `Dvec` is specified, each column of Q is multiplied by the corresponding value in `Dvec`.

Note that `qr.Q(qr, *)` is a special case of `qr.qy(qr, y)` (with a “diagonal” `y`), and `qr.X(qr, *)` is basically `qr.qy(qr, R)` (apart from pivoting and `dimnames` setting).

`qr.R` returns R. This may be pivoted, e.g., if `a <- qr(x)` then `x[, a$pivot]` = QR. The number of rows of R is either `nrow(X)` or `ncol(X)` (and may depend on whether `complete` is `TRUE` or `FALSE`).

### See Also

`qr`, `qr.qy`.

### Examples

    p <- ncol(x <- LifeCycleSavings[, -1]) # not the 'sr'
    qrstr <- qr(x)   # dim(x) == c(n,p)
    qrstr $ rank # = 4 = p
    Q <- qr.Q(qrstr) # dim(Q) == dim(x)
    R <- qr.R(qrstr) # dim(R) == ncol(x)
    X <- qr.X(qrstr) # X == x
    range(X - as.matrix(x))  # ~ < 6e-12
    ## X == Q %*% R if there has been no pivoting, as here:
    all.equal(unname(X),
              unname(Q %*% R))

    # example of pivoting
    x <- 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))
    x # is singular, columns "b2" and "c3" are "extra"
    a <- qr(x)
    zapsmall(qr.R(a)) # columns are int b1 c1 c2 b2 c3
    a$pivot
    pivI <- sort.list(a$pivot) # the inverse permutation
    all.equal (x,            qr.Q(a) %*% qr.R(a)) # no, no
    stopifnot(
     all.equal(x[, a$pivot], qr.Q(a) %*% qr.R(a)),          # TRUE
     all.equal(x           , qr.Q(a) %*% qr.R(a)[, pivI]))  # TRUE too!

[Package base version 3.1.2 Index]