

   RReeccoonnssttrruucctt tthhee QQ,, RR,, oorr XX MMaattrriicceess ffrroomm aa QQRR OObbjjeecctt

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

   AArrgguummeennttss::

      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 num-
             ber 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 col-
             umn of the returned Q will be multiplied by the
             corresponding diagonal value.

   DDeessccrriippttiioonn::

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

   VVaalluuee::

        `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) comple-
        tion of `X' are returned.

        `qr.Q' returns Q, the order-nrow(X) orthogonal (uni-
        tary) transformation represented by qrstr.  If `com-
        plete' is `TRUE', Q has `nrow(X)' columns.  If `com-
        plete' 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'.

   EExxaammpplleess::

        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)

