Classic Gram-Schmidt
Purpose
To code Gram Schmidt algorithm
INPUT MATRIX
> A <- matrix(c(1, 0, 0, 1, 1, 0), nrow = 3, ncol = 2, T)
> print(A)
[,1] [,2]
[1,] 1 0
[2,] 0 1
[3,] 1 0 |
Algo
> m <- dim(A)[1]
> n <- dim(A)[2]
> Q <- matrix(data = NA, nrow = m, ncol = n)
> Q[, 1] <- A[, 1]
> Q[, 1] <- Q[, 1]/sqrt(sum(Q[, 1]^2))
> j <- 2
> for (j in 2:n) {
+ vj <- A[, j]
+ for (i in 1:(j - 1)) {
+ rij <- t(Q[, i]) * A[, j]
+ vj <- vj - rij * Q[, i]
+ }
+ rjj <- sqrt(sum(vj^2))
+ qj <- vj/rjj
+ Q[, j] <- qj
+ } |
Output
> print(Q)
[,1] [,2]
[1,] 0.7071068 0
[2,] 0.0000000 1
[3,] 0.7071068 0
> qr.Q(qr(A))
[,1] [,2]
[1,] -0.7071068 0
[2,] 0.0000000 -1
[3,] -0.7071068 0 |
INPUT MATRIX
> A <- matrix(c(1, 2, 3, 0, 1, 0.5, 0, 0.1, 1), nrow = 3, ncol = 3,
+ T)
> print(A)
[,1] [,2] [,3]
[1,] 1 2.0 3.0
[2,] 0 1.0 0.5
[3,] 0 0.1 1.0 |
Algo
> m <- dim(A)[1]
> n <- dim(A)[2]
> Q <- matrix(data = NA, nrow = m, ncol = n)
> Q[, 1] <- A[, 1]
> Q[, 1] <- Q[, 1]/sqrt(sum(Q[, 1]^2))
> for (j in 2:n) {
+ vj <- A[, j]
+ for (i in 1:(j - 1)) {
+ rij <- t(Q[, i]) %*% vj
+ vj <- vj - rij * Q[, i]
+ }
+ rjj <- sqrt(sum(vj^2))
+ qj <- vj/rjj
+ Q[, j] <- qj
+ } |
Output
> print(Q)
[,1] [,2] [,3]
[1,] 1 0.00000000 0.00000000
[2,] 0 0.99503719 -0.09950372
[3,] 0 0.09950372 0.99503719
> qr.Q(qr(A))
[,1] [,2] [,3]
[1,] -1 0.00000000 0.00000000
[2,] 0 -0.99503719 -0.09950372
[3,] 0 -0.09950372 0.99503719 |
The above gives Gram - Schmidt basis.. What’s wrong with this algo ?