For a sparse \(m \times n\) (“long”: \(m \ge n\))
rectangular matrix \(A\), the sparse QR decomposition is either
of the form \(P A = Q R\) with a (row)
permutation matrix \(P\), (encoded in the `p`

slot of the
result) if the `q`

slot is of length 0,
or of the form \(P A P* = Q R\) with an extra (column) permutation
matrix \(P*\) (encoded in the `q`

slot).
Note that the row permutation \(P A\) in R is simply `A[p+1, ]`

where `p`

is the `p`

-slot, a 0-based permutation of
`1:m`

applied to the rows of the original matrix.

If the `q`

slot has length `n`

it is a 0-based permutation
of `1:n`

applied to the columns of the original matrix to reduce
the amount of “fill-in” in the matrix \(R\), and
\(A P*\) in R is simply `A[ , q+1]`

.

\(R\) is an \(m\times n\) matrix that is zero below the
main diagonal, i.e., upper triangular (\(m\times m\)) with
\(m-n\) extra zero rows.

The matrix \(Q\) is a "virtual matrix". It is the product of
\(n\) Householder transformations. The information to generate
these Householder transformations is stored in the `V`

and
`beta`

slots.

Note however that `qr.Q()`

returns the row permuted matrix
\(Q* := P^{-1}Q = P'Q\) as permutation matrices are
orthogonal; and \(Q*\) is orthogonal itself because \(Q\) and \(P\) are.
This is useful because then, as in the dense matrix and base R
matrix `qr`

case, we have the mathematical identity
$$P A = Q* R,$$ in R as

A[p+1,] == qr.Q(*) %*% R .

The `"sparseQR"`

methods for the `qr.*`

functions return
objects of class `"dgeMatrix"`

(see
`'>dgeMatrix`

). Results from `qr.coef`

,
`qr.resid`

and `qr.fitted`

(when `k == ncol(R)`

) are
well-defined and should match those from the corresponding dense matrix
calculations. However, because the matrix `Q`

is not uniquely
defined, the results of `qr.qy`

and `qr.qty`

do not
necessarily match those from the corresponding dense matrix
calculations.

Also, the results of `qr.qy`

and `qr.qty`

apply to the
permuted column order when the `q`

slot has length `n`

.