Linear Algebra and the C Language/a0lm


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as:   c04a.c                   */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define   RA R4
#define   CA C2
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
{
double a[RA*(CA)]={
  2,  0,
  0,  3,
  0,  0,
  4,  5
};

double x[RA*(C1)]={
 -1, 
  2, 
 -3,
 -3,
};

double **A         =      ca_A_mR(a,          i_mR(RA,CA));
double **AT        = transpose_mR(A,          i_mR(CA,RA));
double **ATA       =       mul_mR(AT,A,       i_mR(CA,CA)); 
double **invATA    =     invgj_mR(ATA,        i_mR(CA,CA));
double **invATA_AT =       mul_mR(invATA,AT,  i_mR(CA,RA));
double **V         =       mul_mR(A,invATA_AT,i_mR(RA,RA));
                           /* A inv(AT A) AT */   

double **X         =      ca_A_mR(x,          i_mR(RA,C1));
double **VX        =       mul_mR(V,X,        i_mR(RA,C1));

  clrscrn();
  printf(" A is subspace of R%d             \n\n"
         " Find a transformation matrix for   \n"
         " a projection onto R%d.           \n\n"
         " Proj(x) =  A inv(AT A) AT        \n\n",RA,RA);
         
  printf(" A:");
  p_mR(A,S5,P1,C7);
  stop();
  
  clrscrn();
  printf(" AT:");
  p_mR(AT,S5,P1,C7);
  
  printf(" AT A:");
  p_mR(ATA,S5,P1,C7);
  
  printf(" inv(ATA):");
  p_mR(invATA,S5,P4,C7); 
   
  printf(" inv(ATA) AT:");
  p_mR(invATA_AT,S5,P4,C7); 
  
  printf(" V = A inv(ATA)AT");
  p_mR(V,S5,P4,C7);    
  stop();  
  
  clrscrn();
  printf(" V is transformation matrix for     \n"
         " a projection onto a R%d subspace \n\n"
         " V:",RA);
  p_mR(V,S5,P4,C7); 
  
  printf(" X:");
  p_mR(X,S5,P1,C7);
  
  printf(" Proj(x) =  A inv(ATA)AT x \n\n"  
         " Proj(x) =  V x      Verify the result with the last C file");  
  p_mR(VX,S5,P4,C7); 
  stop();    
  
  f_mR(A);
  f_mR(AT);
  f_mR(ATA);       
  f_mR(invATA);    
  f_mR(invATA_AT); 
  f_mR(V);         /* A inv(AT A) AT */ 
  
  f_mR(X); 
  f_mR(VX);         

  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */

Screen output example:

                                                                                       
 A is subspace of R4             

 Find a transformation matrix for   
 a projection onto R4.           

 Proj(x) =  A inv(AT A) AT        

 A:
 +2.0  +0.0 
 +0.0  +3.0 
 +0.0  +0.0 
 +4.0  +5.0 

 Press return to continue. 


 AT:
 +2.0  +0.0  +0.0  +4.0 
 +0.0  +3.0  +0.0  +5.0 

 AT A:
+20.0 +20.0 
+20.0 +34.0 

 inv(ATA):
+0.1214 -0.0714 
-0.0714 +0.0714 

 inv(ATA) AT:
+0.2429 -0.2143 +0.0000 +0.1286 
-0.1429 +0.2143 +0.0000 +0.0714 

 V = A inv(ATA)AT
+0.4857 -0.4286 +0.0000 +0.2571 
-0.4286 +0.6429 +0.0000 +0.2143 
+0.0000 +0.0000 +0.0000 +0.0000 
+0.2571 +0.2143 +0.0000 +0.8714 

 Press return to continue. 


 V is transformation matrix for     
 a projection onto a R4 subspace  

 V:
+0.4857 -0.4286 +0.0000 +0.2571 
-0.4286 +0.6429 +0.0000 +0.2143 
+0.0000 +0.0000 +0.0000 +0.0000 
+0.2571 +0.2143 +0.0000 +0.8714 

 X:
 -1.0 
 +2.0 
 -3.0 
 -3.0 

 Proj(x) =  A inv(ATA)AT x 

 Proj(x) =  V x      Verify the result with the last C file
-2.1143 
+1.0714 
+0.0000 
-2.4429 

 Press return to continue.