QR factorizations in Julia

Julia provides access to both the thin and full forms of the QR factorization.

using LinearAlgebra
A = rand(1.:9.,6,4)
@show m,n = size(A);
(m, n) = size(A) = (6, 4)

Here is a standard call:

Q,R = qr(A);
Q
6×6 LinearAlgebra.QRCompactWYQ{Float64,Array{Float64,2}}:
 -0.666667    0.106601    0.318448    -0.423568    0.119768   0.499027
 -0.416667   -0.300207   -0.187934     0.0460732  -0.824902  -0.135496
 -0.583333    0.234365   -0.113155     0.635183    0.318998  -0.294575
 -0.166667   -0.0297855   0.00915739  -0.589747    0.186044  -0.767357
 -0.0833333  -0.917865    0.0841625    0.120783    0.355792   0.0481651
 -0.0833333  -0.0148928  -0.918314    -0.22939     0.205506   0.233839
R
4×4 Array{Float64,2}:
 -12.0  -10.4167   -5.58333  -10.5
   0.0   -8.85963  -4.49683   -3.0052
   0.0    0.0      -7.04307    0.161705
   0.0    0.0       0.0       -5.35655

If you look carefully, you see that we got a full \(Q\) but a thin \(R\). Moreover, the \(Q\) above is not a standard matrix type. If you convert it to a true matrix, then it reverts to the thin form.

Matrix(Q)
6×4 Array{Float64,2}:
 -0.666667    0.106601    0.318448    -0.423568
 -0.416667   -0.300207   -0.187934     0.0460732
 -0.583333    0.234365   -0.113155     0.635183
 -0.166667   -0.0297855   0.00915739  -0.589747
 -0.0833333  -0.917865    0.0841625    0.120783
 -0.0833333  -0.0148928  -0.918314    -0.22939

We can test that \(\mathbf{Q}\) is orthogonal.

QTQ = Q'*Q
norm(QTQ - I)
8.41217758417149e-16

The thin \(Q\) cannot be an orthogonal matrix, because it is not even square, but it is still ONC.

Matrix(Q)'*Matrix(Q) - I
4×4 Array{Float64,2}:
  2.22045e-16  -4.80008e-17  -2.38854e-17  5.30075e-17
 -4.80008e-17  -3.33067e-16   2.38779e-17  3.4396e-18
 -2.38854e-17   2.38779e-17  -4.44089e-16  6.05498e-18
  5.30075e-17   3.4396e-18    6.05498e-18  2.22045e-16