suppressMessages(
library(tidyverse)
)
Let A be a m by n matrix such that _m \(\neq\) n. Therefore _ATA will equal a matrix with dimension n by n. While AAT will equal a matrix with dimension m by m. Since m \(\neq\) n, then ATA \(\neq\) AAT. QED
For example:
A <- matrix(seq(1, 6, by = 1), nrow = 3, byrow = TRUE)
# Transpose of A left multiply A
t(A) %*% A
## [,1] [,2]
## [1,] 35 44
## [2,] 44 56
# A left multiply Transpose of A
A %*% t(A)
## [,1] [,2] [,3]
## [1,] 5 11 17
## [2,] 11 25 39
## [3,] 17 39 61
For a square matrix A, ATA \(=\) AAT is true if A is a symmetrical matrix, i.e. A \(=\) AT
For example:
content <- c(3, 4, 4, 2)
A <- matrix(content, nrow = 2, byrow = TRUE)
# Compare A with it Transpose
A == t(A) # Both matrix are equal
## [,1] [,2]
## [1,] TRUE TRUE
## [2,] TRUE TRUE
# Compare Transpose of A left multiply A with # A left multiply Transpose of A
t(A) %*% A == A %*% t(A) # Both matrix are equal
## [,1] [,2]
## [1,] TRUE TRUE
## [2,] TRUE TRUE
Therefore if A \(=\) AT then AAT \(=\) ATA
lu_factorization <- function(A) {
# Check if the matrix is square
if (ncol(A) != nrow(A)) {
return("Input matrix must be square for LU factorization.")
}
n <- nrow(A)
# Initialize L and U matrices
L <- diag(n)
U <- matrix(0, n, n)
for (k in 1:n) {
# Populate L and U matrices
U[k, k] <- A[k, k]
if(k + 1 <= n){
for (i in (k + 1):n){
L[i, k] <- A[i, k]/U[k, k]
U[k, i] <- A[k, i]
}
# Update rest of matrix accordingly
for (i in (k + 1):n){
for (j in (k + 1):n){
A[i, j] <- A[i, j] - (L[i, k] %*% U[k, j])
}
}
}
}
# Return the L and U
return(list(L = L, U = U))
}
# Example usage
A <- matrix(c(2, 3, 1, 5, 6, 13, 5, 19, 2, 19, 10, 23, 4, 10, 11, 31),
nrow = 4,
byrow = TRUE)
# Perform LU factorization
lu_result <- lu_factorization(A)
# Display the result
print("Original Matrix A:")
## [1] "Original Matrix A:"
print(A)
## [,1] [,2] [,3] [,4]
## [1,] 2 3 1 5
## [2,] 6 13 5 19
## [3,] 2 19 10 23
## [4,] 4 10 11 31
print("Matrix L:")
## [1] "Matrix L:"
print(lu_result$L)
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 3 1 0 0
## [3,] 1 4 1 0
## [4,] 2 1 7 1
print("Matrix U:")
## [1] "Matrix U:"
print(lu_result$U)
## [,1] [,2] [,3] [,4]
## [1,] 2 3 1 5
## [2,] 0 4 2 4
## [3,] 0 0 1 2
## [4,] 0 0 0 3
# Compare LU factorization with original A matrix
(lu_result$L %*% lu_result$U) == A
## [,1] [,2] [,3] [,4]
## [1,] TRUE TRUE TRUE TRUE
## [2,] TRUE TRUE TRUE TRUE
## [3,] TRUE TRUE TRUE TRUE
## [4,] TRUE TRUE TRUE TRUE