suppressMessages(
  library(tidyverse)
)

Problem Set 1.1

Show that ATA \(\neq\) AAT in general form

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

Problem Set 1.2

For a special type of square matrix A, we get ATA \(=\) AAT.

Under what conditin is this true?

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

Problem Set 2

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