The Gram-Schmidt Process and the QR Decomposition

See the Help Menu. Search for "orthogonal."

First load the package for Gram-Schmidt:

<< LinearAlgebra`Orthogonalization`

Example

To apply the GramSchmidt process to the vectors (2, -1, 0),  (-1, 
        2, 1-),  (0, -1, 2):

(Subscript[v, 1]) =  {2, -1, 0};  (Subscript[v, 2]) =  {-1, 2, 1};  
    (Subscript[v, 3]) =  {0, -1, 2};

First vector:

(Subscript[w, 1]) =  (Subscript[v, 1]);  (Subscript[q, 1]) =  (Subscript[w, 1])/(Sqrt[(Subscript[w, 1]) .  (Subscript[w, 1])])

We can do the last step to compute (Subscript[w, 1])/ ||  (Subscript[w, 1]) || with:

(Subscript[q, 1]) =  Normalize[(Subscript[w, 1])]

Second vector:

(Subscript[w, 2]) =  (Subscript[v, 2]) -  (Subscript[w, 1]) .  ((Subscript[v, 2])/(Subscript[w, 1])) .  (Subscript[w, 1]) (Subscript[w, 1])

We could also use:

(Subscript[w, 2]) =  (Subscript[v, 2]) -  Projection[(Subscript[v, 2]), (Subscript[w, 1])]

(Subscript[q, 2]) =  Normalize[(Subscript[w, 2])]

Third vector:

(Subscript[w, 3]) =  
      (Subscript[v, 3]) -  Projection[(Subscript[v, 3]), (Subscript[w, 1])]  -  Projection[(Subscript[v, 3]), (Subscript[w, 2])]

(Subscript[q, 3]) =  Normalize[(Subscript[w, 3])]

Mathematica can do this all in one step:

{(Subscript[q, 1]), (Subscript[q, 2]), (Subscript[q, 3])}  =  
      GramSchmidt[{{2, -1, 0}, {-1, 2, -1}, {0, -1, 
            2}}]

The result is an orthonormal basis:

{(Subscript[q, 1]) . (Subscript[q, 2]),  (Subscript[q, 1]) . (Subscript[q, 3]), (Subscript[q, 2]) . (Subscript[q, 3]), (Subscript[q, 1]) . (Subscript[q, 1]), (Subscript[q, 2]) . (Subscript[q, 2]), 
      (Subscript[q, 3]) . (Subscript[q, 3])}

Example

Consider the vector space of polynomials of degree 2 with inner product defined by f · 
          g  =  ((∫_0)^1) f(x) g(x) d x.
Apply the Gram-Schmidt process to (Subscript[f, 0])(x)  =  1, (Subscript[f, 1])(x)  =  x, (Subscript[f, 2])(x)  =  (x^2).

ip[f_, g_] := (∫_0^1) f g \[DifferentialD]x

First polynomial:

(Subscript[w, 0]) =  1;  (Subscript[q, 0]) =  (Subscript[w, 0])/(Sqrt[ip])[(Subscript[w, 0]), (Subscript[w, 0])]

or,

(Subscript[q, 0]) = 
      Normalize[(Subscript[w, 0]), InnerProduct ->  ip]

Second polynomial:

(Subscript[w, 1]) =  x  -  ip[x, (Subscript[w, 0])]/ip[(Subscript[w, 0]), (Subscript[w, 0])] (Subscript[w, 0])

or,

(Subscript[w, 1]) =  
      x  -  Projection[x, (Subscript[w, 0]), InnerProduct -> ip]

(Subscript[q, 1]) = Normalize[ (Subscript[w, 1]), InnerProduct -> ip]

Third polynomial:

(Subscript[w, 3]) =  
      (x^2) -  Projection[(x^2), (Subscript[w, 0]), InnerProduct -> ip]  -  
        Projection[(x^2), (Subscript[w, 1]), InnerProduct -> ip]

(Subscript[q, 3]) =  Normalize[(Subscript[w, 3]), InnerProduct -> ip]

In one step:

{(Subscript[q, 1]), (Subscript[q, 2]), (Subscript[q, 3])}  =  
      GramSchmidt[{1, x, (x^2)}, InnerProduct -> ip]

The result is an orthonormal basis with respect to this inner porduct:

{ip[(Subscript[q, 1]), (Subscript[q, 2])],  ip[(Subscript[q, 1]), (Subscript[q, 3])],  ip[(Subscript[q, 2]), (Subscript[q, 3])],  
      ip[(Subscript[q, 1]), (Subscript[q, 1])],  ip[(Subscript[q, 2]), (Subscript[q, 2])],  ip[(Subscript[q, 3]), (Subscript[q, 3])]}

QR Decomposition

To find the QR decomposition of a matrix A, First apply the Gram-Schmidt process to the columns of A = [(Subscript[a, 1]) | … | (Subscript[a, n])] to get Q  =  [(Subscript[q, 1]) | … | (Subscript[q, n])], then get the upper triangular matrix R  =  [(Subscript[r, ij])] from the inner products (Subscript[r, ij])  =  (Subscript[q, i])·(Subscript[a, j]).

Example

A = (({{1, 4}, {2, 5}, {3, 6}}));

Extract columns:

{(Subscript[a, 1]), (Subscript[a, 2])}  =  Transpose[A]

Apply Gram-Schmidt to (Subscript[a, 1]),  (Subscript[a, 2]):

{(Subscript[q, 1]), (Subscript[q, 2])} = GramSchmidt[{(Subscript[a, 1]), (Subscript[a, 2])}]

Put (Subscript[q, 1]),  (Subscript[q, 2])in Q as columns:

Q  =  Transpose[{(Subscript[q, 1]), (Subscript[q, 2])}];  Q // MatrixForm

We could do this in one step with

Q  =  Transpose[GramSchmidt[Transpose[A]]];  
    Q // MatrixForm

Now find R:

R = (({{(Subscript[q, 1]) . (Subscript[a, 1]), (Subscript[q, 1]) . (Subscript[a, 2])}, {0, (Subscript[q, 2]) . (Subscript[a, 2])}})); R // MatrixForm

Check:

Q . R // Simplify // MatrixForm

We could also simply use Mathematica's built-in function:

{Q, R}  = QRDecomposition[A];

Q // MatrixForm
R // MatrixForm

Example

A = (({{2, -1, 0}, {-1, 2, -1}, {0, -1, 2}}));

Extract columns:

{(Subscript[a, 1]), (Subscript[a, 2]), (Subscript[a, 3])}  =  Transpose[A];

Apply Gram-Schmidt:

{(Subscript[q, 1]), (Subscript[q, 2]), (Subscript[q, 3])}  =  GramSchmidt[{(Subscript[a, 1]), (Subscript[a, 2]), (Subscript[a, 3])}]

Put into columns of Q:

Q  =  Transpose[{(Subscript[q, 1]), (Subscript[q, 2]), (Subscript[q, 3])}];  Q // MatrixForm

We could do this in one step with

Q  =  Transpose[GramSchmidt[Transpose[A]]];  
    Q // MatrixForm

Check that Q is orthogonal:

Inverse[Q] // MatrixForm
Transpose[Q] // MatrixForm

Q . Transpose[Q] // MatrixForm

Now find R:

R  =  
      Table[If[i ≤ j, (Subscript[q, i]) . (Subscript[a, j]),  0], {i, 1, 3}, {j, 1, 3}] // 
        Simplify;  R // MatrixForm

Check:

Q . R // Simplify // MatrixForm

Using Mathematica's built-in function:

{Q, R}  = QRDecomposition[A];

Q // MatrixForm
R // MatrixForm