## generate sample data
set.seed(1234)
n <- 12
p <- 5
X <- matrix(rnorm(n * p), n, p)
## get the full QR decomposition with pivot
qr_res <- fastQR::qr_fast(X = X,
tol = sqrt(.Machine$double.eps),
pivot = TRUE)
## reconstruct the reduced Q and R matrices
## reduced Q matrix
Q1 <- qr_Q(qr = qr_res$qr, tau = qr_res$qraux,
rank = qr_res$rank, complete = FALSE)
Q1
## check the Q matrix (orthogonality)
max(abs(crossprod(Q1)-diag(1, p)))
## complete Q matrix
Q2 <- qr_Q(qr = qr_res$qr, tau = qr_res$qraux,
rank = NULL, complete = TRUE)
Q2
## check the Q matrix (orthogonality)
max(abs(crossprod(Q2)-diag(1, n)))
## reduced R matrix
R1 <- qr_R(qr = qr_res$qr,
rank = NULL,
complete = FALSE)
## check that X^TX = R^TR
## get the permutation matrix
P <- qr_pivot2perm(pivot = qr_res$pivot)
max(abs(crossprod(R1 %*% P) - crossprod(X)))
max(abs(crossprod(R1) - crossprod(X %*% t(P))))
## complete R matrix
R2 <- qr_R(qr = qr_res$qr,
rank = NULL,
complete = TRUE)
## check that X^TX = R^TR
## get the permutation matrix
P <- qr_pivot2perm(pivot = qr_res$pivot)
max(abs(crossprod(R2 %*% P) - crossprod(X)))
max(abs(crossprod(R2) - crossprod(X %*% t(P))))
## check that X = Q %*% R
max(abs(Q2 %*% R2 %*% P - X))
max(abs(Q1 %*% R1 %*% P - X))
## create data: n > p
set.seed(1234)
n <- 120
p <- 75
X <- matrix(rnorm(n * p), n, p)
## get the full QR decomposition with pivot
qr_res <- fastQR::qr_fast(X = X, pivot = FALSE)
## reconstruct the reduced Q and R matrices
## reduced Q matrix
Q1 <- qr_Q(qr = qr_res$qr, tau = qr_res$qraux,
rank = p,
complete = FALSE)
## check the Q matrix (orthogonality)
max(abs(crossprod(Q1)-diag(1, p)))
## complete Q matrix
Q2 <- qr_Q(qr = qr_res$qr, tau = qr_res$qraux,
rank = NULL, complete = TRUE)
## check the Q matrix (orthogonality)
max(abs(crossprod(Q2)-diag(1, n)))
## reduced R matrix
R1 <- qr_R(qr = qr_res$qr,
rank = NULL,
complete = FALSE)
## check that X^TX = R^TR
max(abs(crossprod(R1) - crossprod(X)))
## complete R matrix
R2 <- qr_R(qr = qr_res$qr,
rank = NULL,
complete = TRUE)
## check that X^TX = R^TR
max(abs(crossprod(R2) - crossprod(X)))
## check that X^TX = R^TR
max(abs(crossprod(R2) - crossprod(X)))
max(abs(crossprod(R2) - crossprod(X)))
max(abs(crossprod(R1) - crossprod(X)))
# check that X = Q %*% R
max(abs(Q2 %*% R2 - X))
max(abs(Q1 %*% R1 - X))
Run the code above in your browser using DataLab