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

## Usage

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

## Arguments

`qrstr` | 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 Q or X matrices is to be made, or whether the R matrix is to be completed by binding zero-value rows beneath the square upper triangle.
`ncol` | integer in the range `1:nrow(qrstr$qr)`. The number of columns to be in the reconstructed X. The default when `complete` is `FALSE` is the original X from which the qr object was constructed. The default when `complete` is `TRUE` is a square matrix with the original 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 Q will be multiplied by the corresponding diagonal value.

## Description

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

## Value

`qr.X` returns X, the original matrix from which the qr object was constructed. 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 Q, the order-nrow(X) orthogonal (unitary) transformation represented by qrstr. 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`.

`qr.R` returns R, the upper triangular matrix such that `X == Q %*% R`. The number of rows of R is `nrow(X)` or `ncol(X)`, depending on whether `complete` is `TRUE` or `FALSE`.

## Examples

    data(savings)
    p <- ncol(x <- savings[,-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 :
    all((1 - X /( Q %*% R))< 100*.Machine$double.eps)#TRUE

    dim(Qc <- qr.Q(qrstr, complete=TRUE)) # Square: dim(Qc) == rep(nrow(x),2)
    all((crossprod(Qc) - diag(nrow(x))) < 10*.Machine $double.eps)

    QD <- qr.Q(qrstr, D=1:p)      # QD == Q %*% diag(1:p)
    all(QD - Q %*% diag(1:p)  < 8* .Machine$double.eps)

    dim(Rc <- qr.R(qrstr, complete=TRUE)) # == dim(x)
    dim(Xc <- qr.X(qrstr, complete=TRUE)) # square: nrow(x) ^ 2
    all(Xc[,1:p] == X)

[Package Contents]