#install.packages("pracma", repos="http://R-Forge.R-project.org")
library("dplyr")
Matrix factorization is a very important problem. There are supercomputers built just to do matrix factorizations. Every second you are on an airplane, matrices are being factorized. Radars that track flights use a technique called Kalman ltering. At the heart of Kalman Filtering is a Matrix Factorization operation. Kalman Filters are solving linear systems of equations when they track your light using radars.
Write an R function to factorize a square matrix A into LU or LDU, whichever you prefer. Please submit your response in an R Markdown document using our class naming convention, E.g. LFulton_Assignment2_PS2.png
You don’t have to worry about permuting rows of A and you can assume that A is less than 5x5, if you need to hard-code any variables in your code. If you doing the entire assignment in R, then please submit only one markdown document for both the problems.
#for swap rows in matrix
swap<-function(My_matrix,i,m){
j=i
temp=My_matrix
while((My_matrix[i,j]==0) && (i<=m)) i=i+1
if(My_matrix[i,j]!=0){
My_matrix[j,]=My_matrix[i,]
My_matrix[i,]=temp[j,]
}
return(My_matrix)
}
U<-function(My_matrix) {
M=nrow(My_matrix)
N=nrow(My_matrix)
i=1
j=1
k=1
while(i<=M && j<=N){
if(My_matrix[i,j]==0) swap(My_matrix,i,j,M)
if(My_matrix[i,i]==0) {
j=j+1
}
if(My_matrix[i,j]!=0) {
My_matrix[i,]<-My_matrix[i,]/My_matrix[i,j]
k=i+1
while(k<=M){
My_matrix[k,] <-My_matrix[k,]-My_matrix[k,j]/My_matrix[i,j]*My_matrix[i,]
k=k+1
}
i=i+1
j=j+1
}
}
return(round(My_matrix,2))
}
D<-function(My_matrix) {
M=nrow(My_matrix)
for(i in 1:M){
if(My_matrix[i,i]==0) swap(My_matrix,i,M)
j=i+1
while(j<=M){
if(My_matrix[i,i]!=0) My_matrix[j,] <-My_matrix[j,] -
My_matrix[j,i]/My_matrix[i,i]*My_matrix[i,]
j=j+1
}
}
for(a in M:2){
for (b in (a-1):1){
if(My_matrix[a,a]!=0) My_matrix[b,] <-My_matrix[b,] -
My_matrix[b,a]/My_matrix[a,a]*My_matrix[a,]
}
}
return(round(My_matrix,2))
}
L<-function(My_matrix) {
M=nrow(My_matrix)
temp=matrix(c(1:(M*M)),byrow =T,nrow=M,ncol=M)
temp=0*temp
for(i in 1:M){
if(My_matrix[i,i]==0) swap(My_matrix,i,M)
temp[i,i]<-1
if(My_matrix[i,i]==0) swap(My_matrix,i,M)
j=i+1
while(j<=M){
if(My_matrix[i,i]!=0) {
temp[j,i]<-My_matrix[j,i]/My_matrix[i,i]
My_matrix[j,] <-My_matrix[j,] -
My_matrix[j,i]/My_matrix[i,i]*My_matrix[i,]
}
j=j+1
}
}
return(round(temp,2))
}
A <- matrix(c(4,-20,-12,-8,45,44,20,-105,-79),byrow =T,nrow=3,ncol=3)
A
## [,1] [,2] [,3]
## [1,] 4 -20 -12
## [2,] -8 45 44
## [3,] 20 -105 -79
L(A)
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] -2 1 0
## [3,] 5 -1 1
D(A)
## [,1] [,2] [,3]
## [1,] 4 0 0
## [2,] 0 5 0
## [3,] 0 0 1
U(A)
## [,1] [,2] [,3]
## [1,] 1 -5 -3
## [2,] 0 1 4
## [3,] 0 0 1
#R L(A)%*%D(A) matrix mutiplication function works for square matrix
L(A)%*%D(A)%*%U(A)
## [,1] [,2] [,3]
## [1,] 4 -20 -12
## [2,] -8 45 44
## [3,] 20 -105 -79
#for swap rows in matrix
swap<-function(My_matrix,i,j,m){
k=i
temp=My_matrix
while((My_matrix[i,j]==0) && (i<m)) i=i+1
if(My_matrix[i,j]!=0){
My_matrix[k,]=My_matrix[i,]
My_matrix[i,]=temp[k,]
}
return(My_matrix)
}
L<-function(My_matrix) {
M=nrow(My_matrix)
N=nrow(My_matrix)
temp=matrix(c(1:(M*M)),byrow =T,nrow=M,ncol=M)
temp=0*temp
for(i in 1:M){
temp[i,i]<-1
}
i=1
j=1
k=1
while(i<=M && j<=N){
if(My_matrix[i,j]==0) swap(My_matrix,i,j,M)
if(My_matrix[i,i]==0) {
j=j+1
}
if(My_matrix[i,j]!=0) {
#My_matrix[i,]<-My_matrix[i,]/My_matrix[i,j]
k=i+1
while(k<=M){
temp[k,i]<-My_matrix[k,j]/My_matrix[i,j]
My_matrix[k,] <-My_matrix[k,]-My_matrix[k,j]/My_matrix[i,j]*My_matrix[i,]
k=k+1
}
i=i+1
j=j+1
}
}
return(round(temp,2))
}
U<-function(My_matrix) {
M=nrow(My_matrix)
N=nrow(My_matrix)
i=1
j=1
k=1
while(i<=M && j<=N){
if(My_matrix[i,j]==0) swap(My_matrix,i,j,M)
if(My_matrix[i,i]==0) {
j=j+1
}
if(My_matrix[i,j]!=0) {
#My_matrix[i,]<-My_matrix[i,]/My_matrix[i,j]
k=i+1
while(k<=M){
My_matrix[k,] <-My_matrix[k,]-My_matrix[k,j]/My_matrix[i,j]*My_matrix[i,]
k=k+1
}
i=i+1
j=j+1
}
}
return(round(My_matrix,2))
}
A <- matrix(c(4,-20,-12,-8,45,44,20,-105,-79),byrow =T,nrow=3,ncol=3)
A
## [,1] [,2] [,3]
## [1,] 4 -20 -12
## [2,] -8 45 44
## [3,] 20 -105 -79
U(A)
## [,1] [,2] [,3]
## [1,] 4 -20 -12
## [2,] 0 5 20
## [3,] 0 0 1
L(A)
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] -2 1 0
## [3,] 5 -1 1
#R L(A)%*%D(A) matrix mutiplication function works for square matrix
L(A)%*%U(A)
## [,1] [,2] [,3]
## [1,] 4 -20 -12
## [2,] -8 45 44
## [3,] 20 -105 -79
A <- matrix(c(2,4,-1,5,-2,-4,-5,3,-8,1,2,-5,-4,1,8,-6,0,7,-3,1),byrow =T,nrow=4,ncol=5)
A
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 4 -1 5 -2
## [2,] -4 -5 3 -8 1
## [3,] 2 -5 -4 1 8
## [4,] -6 0 7 -3 1
U(A)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 4 -1 5 -2
## [2,] 0 3 1 2 -3
## [3,] 0 0 0 2 1
## [4,] 0 0 0 0 5
L(A)
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] -2 1 0 0
## [3,] 1 -3 1 0
## [4,] -3 4 2 1
L(A)%*%U(A)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 4 -1 5 -2
## [2,] -4 -5 3 -8 1
## [3,] 2 -5 -4 1 8
## [4,] -6 0 7 -3 1