Linear Algebra and the C Language/a0n2


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as:  c00b.c                    */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
#define ARRAY   A3
/* ------------------------------------ */
#define RC     RC3
/* ------------------------------------ */
void fun(void)
{
double **A         = rsymmetric_mR(        i_mR(RC,RC),999);
double **AEVect    =     eigs_V_mR(A,      i_mR(RC,RC));
double **InvAEVect =  transpose_mR(AEVect, i_mR(RC,RC));

double **T         =                       i_mR(RC,RC);
double **Ide       =                       i_mR(RC,RC);

double **b [ARRAY];
double **r [ARRAY];
double **br[ARRAY];

int i;

  for(i=A0; i<ARRAY; i++)
     {
       b[i]  = c_c_mR(   AEVect,i+C1, i_mR(RC,C1),C1);
       r[i]  = c_r_mR(InvAEVect,i+R1, i_mR(R1,RC),R1);
      
       br[i] = mul_mR(b[i],r[i],      i_mR(RC,RC));  
      }
              
  clrscrn();
  printf(" A:");
  p_mR(A, S10,P4,C6);

  printf(" AEVect:        Eingvectors of A");
  p_mR(AEVect, S10,P4,C6);

  printf(" InvAEVect:     Eingvectors of InvA");
  p_mR(InvAEVect, S10,P4,C6);
  stop(); 
  
  clrscrn();
  printf(" AEVect:        Eingvectors of A");
  p_mR(AEVect, S10,P4,C6);
  
  for(i=A0; i<ARRAY; i++)
     {
       printf(" b%d:",i+C1);
       p_mR(b[i], S10,P4,C6);
      }   
  stop();

  clrscrn();
  printf(" InvAEVect:     Eingvectors of InvA");
  p_mR(InvAEVect, S10,P4,C6);
  
  for(i=A0; i<ARRAY; i++)
     {
       printf(" r%d:",i+R1);
       p_mR(r[i], S10,P4,C6);
      }     
  stop();
      
  clrscrn();
  for(i=A0; i<ARRAY; i++)
     {
      printf(" b%dr%d:",i+C1,i+R1);
      p_mR(br[i], S10,P4,C6);
     }     
  stop();
  
  clrscrn();
  add_mR(br[0], br[1], T); 
  add_mR(   T, br[2], Ide);  
  printf(" b1r1 + b2r2 + b3r3 = Ide");
  p_mR(Ide, S10,P4,C6);
   
  f_mR(A);
  f_mR(AEVect);
  f_mR(InvAEVect);

  f_mR(T);
  f_mR(Ide);
  
  for(i=A0; i<ARRAY; i++)
     {
       f_mR( b[i]);
       f_mR( r[i]);  
       f_mR(br[i]);      
     } 
     
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

do
{
 fun();

} while(stop_w());

  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
A property of spectral decomposition:
 
        b1 r1 + b2 r2 + b3 r3 = Ide
        
 b: The columns of the eigenvectors of A
 r: The rows of eigenvectors of the inverse of A
 
 b1r1 is obtained by multiplying the first column of the eigenvector of A by the first row of the eigenvector of the inverse of A

Screen output example:

                                                                                       
 A:
 +742.0000  +423.0000  +326.0000 
 +423.0000  -552.0000  +137.0000 
 +326.0000  +137.0000  +724.0000 

 AEVect:        Eingvectors of A
   +0.7384    -0.2791    -0.6139 
   +0.2337    +0.9598    -0.1552 
   +0.6326    -0.0289    +0.7740 

 InvAEVect:     Eingvectors of InvA
   +0.7384    +0.2337    +0.6326 
   -0.2791    +0.9598    -0.0289 
   -0.6139    -0.1552    +0.7740 

 Press return to continue. 


 AEVect:        Eingvectors of A
   +0.7384    -0.2791    -0.6139 
   +0.2337    +0.9598    -0.1552 
   +0.6326    -0.0289    +0.7740 

 b1:
   +0.7384 
   +0.2337 
   +0.6326 

 b2:
   -0.2791 
   +0.9598 
   -0.0289 

 b3:
   -0.6139 
   -0.1552 
   +0.7740 

 Press return to continue. 


 InvAEVect:     Eingvectors of InvA
   +0.7384    +0.2337    +0.6326 
   -0.2791    +0.9598    -0.0289 
   -0.6139    -0.1552    +0.7740 

 r1:
   +0.7384    +0.2337    +0.6326 

 r2:
   -0.2791    +0.9598    -0.0289 

 r3:
   -0.6139    -0.1552    +0.7740 

 Press return to continue. 


 b1r1:
   +0.5452    +0.1726    +0.4671 
   +0.1726    +0.0546    +0.1478 
   +0.4671    +0.1478    +0.4001 

 b2r2:
   +0.0779    -0.2679    +0.0081 
   -0.2679    +0.9213    -0.0277 
   +0.0081    -0.0277    +0.0008 

 b3r3:
   +0.3769    +0.0953    -0.4751 
   +0.0953    +0.0241    -0.1201 
   -0.4751    -0.1201    +0.5990 

 Press return to continue. 


 b1r1 + b2r2 + b3r3 = Ide
   +1.0000    -0.0000    +0.0000 
   -0.0000    +1.0000    +0.0000 
   +0.0000    +0.0000    +1.0000 


 Press   return to continue
 Press X return to stop