function to get L and U matrices from LU decomposition of a square matrix A

getLU_Decomp <- function(A) {
  n <- nrow(A)
  if (n != ncol(A)) {
    stop("Input matrix must be square.")
  }
  
  # Initialize matrices L and U
  L <- matrix(0, n, n)
  diag(L) <- 1;
  U <- matrix(0, n, n)
  
  # Perform LU decomposition
  for (i in 1:n) {
    # Set values starting at the diagonal for U
    U[i, i:n] <- A[i, i:n]

    # Compute Lower triangular matrix (L)
    if (i < n) {
      L[(i+1):n, i] <- A[(i+1):n, i] / U[i, i]
      A[(i+1):n, (i+1):n] <- A[(i+1):n, (i+1):n] - outer(L[(i+1):n, i], U[i, (i+1):n])
    }
  }
  # Set diagonal of L to 1
  diag(L) <- 1
  
  # Return the result as a list
  result <- list(L = L, U = U)
  return(result)
}
A <- matrix(c(2, 1, -1, 8, -3, -1, 2, -11, -2, 1, 2, -3, 2, 1, 1, -1), nrow = 4)
A
##      [,1] [,2] [,3] [,4]
## [1,]    2   -3   -2    2
## [2,]    1   -1    1    1
## [3,]   -1    2    2    1
## [4,]    8  -11   -3   -1
lu<- getLU_Decomp(A)
lu
## $L
##      [,1] [,2] [,3] [,4]
## [1,]  1.0    0    0    0
## [2,]  0.5    1    0    0
## [3,] -0.5    1    1    0
## [4,]  4.0    2   -1    1
## 
## $U
##      [,1] [,2] [,3] [,4]
## [1,]    2 -3.0   -2    2
## [2,]    0  0.5    2    0
## [3,]    0  0.0   -1    2
## [4,]    0  0.0    0   -7

Check the results by checking if A = LU

L <- lu$L
U <- lu$U
LxU <-L %*% U
LxU
##      [,1] [,2] [,3] [,4]
## [1,]    2   -3   -2    2
## [2,]    1   -1    1    1
## [3,]   -1    2    2    1
## [4,]    8  -11   -3   -1
A
##      [,1] [,2] [,3] [,4]
## [1,]    2   -3   -2    2
## [2,]    1   -1    1    1
## [3,]   -1    2    2    1
## [4,]    8  -11   -3   -1

Generate 100 random matrices to test on

# Set the seed for reproducibility
set.seed(26);

# Function to generate a random square matrix of size n
generate_random_matrix <- function(n) {
  matrix(rnorm(n^2), nrow = n);
}

# Number of matrices to generate
num_matrices <- 100;

# Maximum size for matrices
max_size <- 4;

# Generate a list of random square matrices
matrix_list <- vector("list", length = num_matrices)
for (i in 1:num_matrices) {
  matrix_list[[i]] <- generate_random_matrix(sample(2:max_size, 1));
}

Test code on all the random matrices

test_results <- list();
for(i in matrix_list){
  LU <- getLU_Decomp(i);
  L <- LU$L
  U <- LU$U
  # use the all.equal function to account for precision issues (adds a tolerance to to the equality)
  if(all.equal(i, L%*%U)) {
    test_results <- append(test_results, TRUE);
  }else{
    test_results <- append(test_results, FALSE);
  }
}

test_results;
## [[1]]
## [1] TRUE
## 
## [[2]]
## [1] TRUE
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] TRUE
## 
## [[5]]
## [1] TRUE
## 
## [[6]]
## [1] TRUE
## 
## [[7]]
## [1] TRUE
## 
## [[8]]
## [1] TRUE
## 
## [[9]]
## [1] TRUE
## 
## [[10]]
## [1] TRUE
## 
## [[11]]
## [1] TRUE
## 
## [[12]]
## [1] TRUE
## 
## [[13]]
## [1] TRUE
## 
## [[14]]
## [1] TRUE
## 
## [[15]]
## [1] TRUE
## 
## [[16]]
## [1] TRUE
## 
## [[17]]
## [1] TRUE
## 
## [[18]]
## [1] TRUE
## 
## [[19]]
## [1] TRUE
## 
## [[20]]
## [1] TRUE
## 
## [[21]]
## [1] TRUE
## 
## [[22]]
## [1] TRUE
## 
## [[23]]
## [1] TRUE
## 
## [[24]]
## [1] TRUE
## 
## [[25]]
## [1] TRUE
## 
## [[26]]
## [1] TRUE
## 
## [[27]]
## [1] TRUE
## 
## [[28]]
## [1] TRUE
## 
## [[29]]
## [1] TRUE
## 
## [[30]]
## [1] TRUE
## 
## [[31]]
## [1] TRUE
## 
## [[32]]
## [1] TRUE
## 
## [[33]]
## [1] TRUE
## 
## [[34]]
## [1] TRUE
## 
## [[35]]
## [1] TRUE
## 
## [[36]]
## [1] TRUE
## 
## [[37]]
## [1] TRUE
## 
## [[38]]
## [1] TRUE
## 
## [[39]]
## [1] TRUE
## 
## [[40]]
## [1] TRUE
## 
## [[41]]
## [1] TRUE
## 
## [[42]]
## [1] TRUE
## 
## [[43]]
## [1] TRUE
## 
## [[44]]
## [1] TRUE
## 
## [[45]]
## [1] TRUE
## 
## [[46]]
## [1] TRUE
## 
## [[47]]
## [1] TRUE
## 
## [[48]]
## [1] TRUE
## 
## [[49]]
## [1] TRUE
## 
## [[50]]
## [1] TRUE
## 
## [[51]]
## [1] TRUE
## 
## [[52]]
## [1] TRUE
## 
## [[53]]
## [1] TRUE
## 
## [[54]]
## [1] TRUE
## 
## [[55]]
## [1] TRUE
## 
## [[56]]
## [1] TRUE
## 
## [[57]]
## [1] TRUE
## 
## [[58]]
## [1] TRUE
## 
## [[59]]
## [1] TRUE
## 
## [[60]]
## [1] TRUE
## 
## [[61]]
## [1] TRUE
## 
## [[62]]
## [1] TRUE
## 
## [[63]]
## [1] TRUE
## 
## [[64]]
## [1] TRUE
## 
## [[65]]
## [1] TRUE
## 
## [[66]]
## [1] TRUE
## 
## [[67]]
## [1] TRUE
## 
## [[68]]
## [1] TRUE
## 
## [[69]]
## [1] TRUE
## 
## [[70]]
## [1] TRUE
## 
## [[71]]
## [1] TRUE
## 
## [[72]]
## [1] TRUE
## 
## [[73]]
## [1] TRUE
## 
## [[74]]
## [1] TRUE
## 
## [[75]]
## [1] TRUE
## 
## [[76]]
## [1] TRUE
## 
## [[77]]
## [1] TRUE
## 
## [[78]]
## [1] TRUE
## 
## [[79]]
## [1] TRUE
## 
## [[80]]
## [1] TRUE
## 
## [[81]]
## [1] TRUE
## 
## [[82]]
## [1] TRUE
## 
## [[83]]
## [1] TRUE
## 
## [[84]]
## [1] TRUE
## 
## [[85]]
## [1] TRUE
## 
## [[86]]
## [1] TRUE
## 
## [[87]]
## [1] TRUE
## 
## [[88]]
## [1] TRUE
## 
## [[89]]
## [1] TRUE
## 
## [[90]]
## [1] TRUE
## 
## [[91]]
## [1] TRUE
## 
## [[92]]
## [1] TRUE
## 
## [[93]]
## [1] TRUE
## 
## [[94]]
## [1] TRUE
## 
## [[95]]
## [1] TRUE
## 
## [[96]]
## [1] TRUE
## 
## [[97]]
## [1] TRUE
## 
## [[98]]
## [1] TRUE
## 
## [[99]]
## [1] TRUE
## 
## [[100]]
## [1] TRUE