GramSchmidt - Householder Transformation
Purpose
To code up Gram Schmidt and HH Algos
Gram-Schmidt Algo
> gs <- function(A) { + 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 + } + return(Q) + } |
Modified Gram-Schmidt
> gs.mod <- function(A) { + m <- dim(A)[1] + n <- dim(A)[2] + Q <- matrix(data = NA, nrow = m, ncol = n) + for (j in 1:n) { + Q[, j] <- A[, j] + } + j <- 1 + for (j in 1:n) { + rjj <- sqrt(sum(Q[, j]^2)) + Q[, j] <- Q[, j]/rjj + if (j < n) { + for (i in (j + 1):n) { + rij <- t(Q[, j]) %*% Q[, i] + Q[, i] <- Q[, i] - rij * Q[, j] + } + } + } + return(Q) + } |
Test Gram-Schmidt and Modified Gram-Schmidt
> 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 > print(gs(A)) [,1] [,2] [,3] [1,] 1 0.00000000 0.00000000 [2,] 0 0.99503719 -0.09950372 [3,] 0 0.09950372 0.99503719 > print(gs.mod(A)) [,1] [,2] [,3] [1,] 1 0.00000000 0.00000000 [2,] 0 0.99503719 -0.09950372 [3,] 0 0.09950372 0.99503719 |
HouseHolder Triangularization
> HHT <- function(A) { + A.bkup <- A + m <- dim(A)[1] + n <- dim(A)[2] + norm2 <- function(x) { + sqrt(sum(x^2)) + } + Q <- matrix(data = 0, nrow = (n * m), ncol = m) + k <- 1 + for (k in 1:n) { + Qt <- diag(m) + x <- A[k:m, k] + e1 <- c(1, rep(0, (length(x) - 1))) + Vk <- sign(x[1]) * norm2(x) * e1 + x + Vk <- Vk/norm2(Vk) + Qt[k:m, k:n] <- diag(length(x)) - 2 * Vk %*% t(Vk) + A[k:m, k:n] <- A[k:m, k:n] - 2 * Vk %*% t(Vk) %*% A[k:m, + k:n] + Q[(4 * k - 3):(4 * k), ] <- Qt + } + Q.f <- diag(m) + for (i in 1:m) { + Q.f <- Q[(4 * i - 3):(4 * i), ] %*% Q.f + } + result <- list(A = A.bkup, A.t = A, Q = Q.f) + } |
Test Householder
> set.seed(12345) > A <- matrix(runif(16), nrow = 4, ncol = 4) > print(HHT(A)) $A [,1] [,2] [,3] [,4] [1,] 0.7209039 0.4564810 0.72770525 0.735684952 [2,] 0.8757732 0.1663718 0.98973694 0.001136587 [3,] 0.7609823 0.3250954 0.03453544 0.391203335 [4,] 0.8861246 0.5092243 0.15237349 0.462494654 $A.t [,1] [,2] [,3] [,4] [1,] -1.628187e+00 -0.7206857 -9.536335e-01 -0.7608957 [2,] 0.000000e+00 0.2857674 -3.555428e-01 0.5260942 [3,] -1.110223e-16 0.0000000 7.054906e-01 0.1160929 [4,] 0.000000e+00 0.0000000 -1.110223e-16 0.1973830 $Q [,1] [,2] [,3] [,4] [1,] -0.4427649 -0.5378825 -0.46738026 -0.5442401 [2,] 0.4807639 -0.7743098 -0.04107847 0.4094178 [3,] 0.6752776 0.2856081 -0.60352213 -0.3133516 [4,] 0.3417974 -0.1719148 0.64469317 -0.6618085 |