Generate a 3x3 orthogonal matrix using the Gram-Schmidt algorithm.

GramSchmidt(v1, v2, v3, order = 1:3)

Arguments

v1, v2, v3

Three length 3 vectors (taken as row vectors).

order

The precedence order for the vectors; see Details.

Details

This function orthogonalizes the matrix rbind(v1, v2, v3) using the Gram-Schmidt algorithm. It can handle rank 2 matrices (returning a rank 3 matrix). If the original is rank 1, it is likely to fail.

The order vector determines the precedence of the original vectors. For example, if it is c(i, j, k), then row i will be unchanged (other than normalization); row j will normally be transformed within the span of rows i and j. Row k will be transformed orthogonally to the span of the others.

Value

A 3x3 matrix whose rows are the orthogonalization of the original row vectors.

Author

Duncan Murdoch

Examples

# Proceed through the rows in order
print(A <- matrix(rnorm(9), 3, 3))
#>            [,1]      [,2]         [,3]
#> [1,] -0.4940813 -0.647212 3.491336e-01
#> [2,]  1.5566400 -1.126534 9.691385e-01
#> [3,] -0.9526286 -1.350823 5.079785e-05
GramSchmidt(A[1, ], A[2, ], A[3, ])
#>          [,1]       [,2]       [,3]
#> v1 -0.5576901 -0.7305350  0.3940816
#> v2  0.8207012 -0.4142486  0.3935068
#> v3  0.1242227 -0.5428781 -0.8305733

# Keep the middle row unchanged
print(A <- matrix(c(rnorm(2), 0, 1, 0, 0, rnorm(3)), 3, 3, byrow = TRUE))
#>            [,1]       [,2]      [,3]
#> [1,] -0.1377840 -0.6537328 0.0000000
#> [2,]  1.0000000  0.0000000 0.0000000
#> [3,] -0.4113343 -0.2977269 0.6723348
GramSchmidt(A[1, ], A[2, ], A[3, ], order = c(2, 1, 3))
#>    [,1] [,2] [,3]
#> v2    0   -1    0
#> v1    1    0    0
#> v3    0    0    1