Linear Algebra and the C Language/a04t


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as:   c00a.c                  */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define   RA R5
#define   CA C3
/* ------------------------------------ */
/* ------------------------------------ */
void fun(void)
{
double **A          =         r_mR(              i_mR(RA,CA),9);
double **A_T        = transpose_mR(A,            i_mR(CA,RA));
double **A_TA       =       mul_mR(A_T,A,        i_mR(CA,CA));  
double **invA_TA    =       inv_mR(A_TA,         i_mR(CA,CA));  
double **invA_TAA_T =       mul_mR(invA_TA,A_T,  i_mR(CA,RA));  
double **Ide        =       mul_mR(invA_TAA_T,A, i_mR(CA,CA));   

  clrscrn();
  printf(" A:");
  p_mR(A, S7,P2,C5);
  printf(" A_T:");
  p_mR(A_T, S7,P2,C5);
  printf(" A_TA:");
  p_mR(A_TA, S7,P2,C5);  
  stop();
  
  clrscrn();  
  printf(" inv(A_TA):");
  pE_mR(invA_TA, S12,P4,C5); 
  printf(" Pseudo Inverse = inv(A_TA) A_T");
  pE_mR(invA_TAA_T, S12,P4,C5);
  printf(" Ide = (inv(A_TA)A_T) A");   
  p_mR(Ide, S8,P2,C5);
 
  f_mR(A);
  f_mR(A_T);
  f_mR(A_TA);        
  f_mR(invA_TA);     
  f_mR(invA_TAA_T);  
  f_mR(Ide); 
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));
do
{
  fun();


} while(stop_w());

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

Screen output example:

 A:
  +1.00   -3.00   -7.00 
  -5.00   -7.00   +8.00 
  +9.00   -1.00   -3.00 
  -4.00   +9.00   -7.00 
  +1.00   -2.00   -9.00 

 A_T:
  +1.00   -5.00   +9.00   -4.00   +1.00 
  -3.00   -7.00   -1.00   +9.00   -2.00 
  -7.00   +8.00   -3.00   -7.00   -9.00 

 A_TA:
+124.00  -15.00  -55.00 
 -15.00 +144.00  -77.00 
 -55.00  -77.00 +252.00 

 Press return to continue. 


 inv(A_TA):
 +9.6526e-03  +2.5484e-03  +2.8854e-03 
 +2.5484e-03  +8.9735e-03  +3.2981e-03 
 +2.8854e-03  +3.2981e-03  +5.6057e-03 

 Pseudo Inverse = inv(A_TA)*A_T
 -1.8190e-02  -4.3018e-02  +7.5669e-02  -3.5873e-02  -2.1413e-02 
 -4.7459e-02  -4.9171e-02  +4.0675e-03  +4.7481e-02  -4.5081e-02 
 -4.6249e-02  +7.3325e-03  +5.8531e-03  -2.1099e-02  -5.4162e-02 

 Ide = (inv(A_TA) A_T) A
   +1.00    +0.00    -0.00 
   +0.00    +1.00    -0.00 
   -0.00    -0.00    +1.00 


 Press   return to continue
 Press X return to stop