#install.packages("pracma", repos="http://R-Forge.R-project.org")
library("dplyr")

2. Problem set 2

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.

Method: square matrix A into LDU

#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))
      
} 

Example 1: 3*3 matrix in LDU

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

Method: M*N matrix A into LU

#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))
      
} 

Example 1:

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

Example 2

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