A <- matrix(c(1,2,3,4,-1,-2,-3,-4,5,6,7,8,-5,-6,-7,-8), nrow=4, byrow=TRUE)
A
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] -1 -2 -3 -4
## [3,] 5 6 7 8
## [4,] -5 -6 -7 -8
A_T = t(A)
A_T
## [,1] [,2] [,3] [,4]
## [1,] 1 -1 5 -5
## [2,] 2 -2 6 -6
## [3,] 3 -3 7 -7
## [4,] 4 -4 8 -8
A%*%A_T == A_T%*%A
## [,1] [,2] [,3] [,4]
## [1,] FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE FALSE
B <- matrix(c(1,2,2,3), nrow=2, byrow=TRUE)
B
## [,1] [,2]
## [1,] 1 2
## [2,] 2 3
B_T <- t(B)
B_T
## [,1] [,2]
## [1,] 1 2
## [2,] 2 3
B%*%B_T == B_T%*%B
## [,1] [,2]
## [1,] TRUE TRUE
## [2,] TRUE TRUE
lu_decomp <- function(m){
# Validate the matrix is square
if(dim(m)[1]!=dim(m)[2]){
return('Error: The matrix is not square, cannot factor')
}
n <- nrow(m) #number of rows in m
U <- m
L <- diag(n) #assign diagonal to L
for (j in c(1:n)){
for(i in c(2:n)){
if(i > j){
row <- U[j,]
mult <- U[i, j] / row[j]
U[i,] <- U[i,] - (mult * row)
L[i,j] <- mult
}
}
}
return(list(L=L, U=U))
}
lu_decomp(A) #A matrix from above. Doesn't seem to work exactly
## $L
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] -1 1 0 0
## [3,] 5 -Inf 1 0
## [4,] -5 Inf NaN 1
##
## $U
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 0 0 0 0
## [3,] NaN NaN NaN NaN
## [4,] NaN NaN NaN NaN