Linear Algebra and the C Language/a0is


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as :   c00b.c                  */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define   RA R3
#define   CA C5
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
{
double a[RA*CA]={  +6,-4,+2,-8,+7, 
                   +9,-6,+9,-3,-9, 
                   -8,+2,+3,-4,-4 };
                                   
double **A          =       ca_A_mR(a,            i_mR(RA,CA)); /* RA,CA        */ 
double **A_T        =  transpose_mR(A,            i_mR(CA,RA)); /* CA,RA        */ 
double **AA_T       =        mul_mR(A,A_T,        i_mR(RA,RA)); /* RA,CA  CA,RA */ 
double **invAA_T    =        inv_mR(AA_T,         i_mR(RA,RA)); /* RA,RA        */ 
double **A_TinvAA_T =        mul_mR(A_T,invAA_T,  i_mR(CA,RA)); /* CA,RA  RA,RA */ 
double **Ide        =        mul_mR(A,A_TinvAA_T, i_mR(RA,RA)); /* RA,CA  CA,RA */ 

  clrscrn();
  printf(" A :");
  p_mR(A, S7,P2,C5);
  
  printf(" A_T :");
  p_mR(A_T, S7,P1,C5);
  printf(" AA_T:");
  p_mR(AA_T, S7,P1,C5);  
  stop();
  
  clrscrn();  
  printf(" inv(AA_T) :");
  pE_mR(invAA_T, S12,P4,C5);  
  printf(" Pseudo Inverse = A_T inv(AA_T):");
  pE_mR(A_TinvAA_T, S12,P4,C5); 
  printf(" Ide = A (A_T inv(AA_T))");    
  p_mR(Ide, S7,P2,C5);
  
  stop();  
  
  f_mR(A);
  f_mR(A_T);
  f_mR(AA_T);        
  f_mR(invAA_T);     
  f_mR(A_TinvAA_T);  
  f_mR(Ide); 

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

Screen output example:

                                                                                       
 A :
  +6.00   -4.00   +2.00   -8.00   +7.00 
  +9.00   -6.00   +9.00   -3.00   -9.00 
  -8.00   +2.00   +3.00   -4.00   -4.00 

 A_T :
   +6.0    +9.0    -8.0 
   -4.0    -6.0    +2.0 
   +2.0    +9.0    +3.0 
   -8.0    -3.0    -4.0 
   +7.0    -9.0    -4.0 

 AA_T:
 +169.0   +57.0   -46.0 
  +57.0  +288.0    -9.0 
  -46.0    -9.0  +109.0 

 Press return to continue. 


 inv(AA_T) :
 +7.1565e-03  -1.3254e-03  +2.9107e-03 
 -1.3254e-03  +3.7267e-03  -2.5165e-04 
 +2.9107e-03  -2.5165e-04  +1.0382e-02 

 Pseudo Inverse = A_T inv(AA_T):
 +7.7242e-03  +2.7601e-02  -6.7856e-02 
 -1.4852e-02  -1.7562e-02  +1.0631e-02 
 +1.1116e-02  +3.0134e-02  +3.4702e-02 
 -6.4918e-02  +4.2992e-04  -6.4058e-02 
 +5.0381e-02  -4.1812e-02  -1.8888e-02 

 Ide = A (A_T inv(AA_T))
  +1.00   +0.00   +0.00 
  +0.00   +1.00   +0.00 
  +0.00   +0.00   +1.00 

 Press return to continue.