Linear Algebra and the C Language/a08g


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as :   c00a.c                  */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
#define  RA    R4
#define  CA    C6
#define  Cb    C1
/* ------------------------------------ */
#define  CbFREE Cb+C3                
/* ------------------------------------ */
int main(void)
{
double ab[RA*(CA+Cb)]={
    +1,      3,     -2,      0,    +2,    +0,    0,
    +2,      6,     -5,     -2,    +4,    -3,    0,
     0,      0,     +5,     10,     0,    15,    0, 
     2,      6,      0,      8,     4,    18,    0,     
};

double **Ab =   ca_A_mR(ab, i_Abr_Ac_bc_mR(RA,CA,Cb));
double **A  = c_Ab_A_mR(Ab,           i_mR(RA,CA));
double **b  = c_Ab_b_mR(Ab,           i_mR(RA,Cb));

double **Ab_free =          i_Abr_Ac_bc_mR(CA,CA,CbFREE);
double **b_free  =                    i_mR(CA,CbFREE); 
double **A_bfree =                    i_mR(RA,CbFREE);

int r;

  clrscrn();
  printf("Find a basis for the orthogonal complement of A :\n\n");
  printf(" A :");
  p_mR(A,S6,P1,C10);
  printf(" b :");
  p_mR(b,S6,P1,C10);
  printf(" Ab :");
  p_mR(Ab,S6,P1,C10);
  stop();

  clrscrn();
  printf(" Ab :  gj_PP_mR(Ab,NO) :");
  gj_PP_mR(Ab,NO);
  p_mR(Ab,S7,P3,C10);
  
  put_zeroR_mR(Ab,Ab_free);  
  printf(" Ab_free : put_zeroR_mR(Ab,Ab_free);");  
  p_mR(Ab_free,S7,P3,C10);  

  put_freeV_mR(Ab_free);
  printf(" Ab_free : put_freeV_mR(Ab_free);");  
  p_mR(Ab_free,S7,P3,C10);  
  stop();
  
  clrscrn();  
  r = rsize_R(Ab_free);
  while(r>R1)    
        zero_above_pivot_gj1Ab_mR(Ab_free,r--);
        
  printf(" Ab_free : zero_above_pivot_gj1Ab_mR(Ab_free,r--);");  
  p_mR(Ab_free,S7,P3,C10);  

  c_Ab_b_mR(Ab_free,b_free);
  printf(" b_free is a basis for the orthogonal complement of A"); 
  p_mR(b_free,S10,P3,C7);
  stop();	
  
  clrscrn();
  printf(" A :");
  p_mR(A,S10,P3,C10);
  printf(" b_free is a basis for the orthogonal complement of A"); 
  p_mR(b_free,S10,P3,C7);
  printf(" The row vectors of A"
         " are orthogonal to the column vectors of bfree\n\n"); 
  printf(" A * bfree: "); 
  p_mR(mul_mR(A,b_free,A_bfree),S10,P3,C7);
  stop();
  
  f_mR(Ab);
  f_mR(A);
  f_mR(b);
      
  f_mR(Ab_free);
  f_mR(b_free);
  f_mR(A_bfree);
  
  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */

By calculating the free variables of the system Ab we will obtain the orthogonal complement of A.

Screen output example:

 Ab :  gj_PP_mR(Ab,NO) :
 +1.000  +3.000  -2.500  -1.000  +2.000  -1.500  +0.000 
 +0.000  +0.000  +1.000  +2.000  +0.000  +3.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000 

 Ab_free : put_zeroR_mR(Ab,Ab_free);
 +1.000  +3.000  -2.500  -1.000  +2.000  -1.500  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +1.000  +2.000  +0.000  +3.000  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000 

 Ab_free : put_freeV_mR(Ab_free);
 +1.000  +3.000  -2.500  -1.000  +2.000  -1.500  +0.000  +0.000  +0.000  +0.000 
 +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000 
 +0.000  +0.000  +1.000  +2.000  +0.000  +3.000  +0.000  +0.000  +0.000  +0.000 
 +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +1.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000 

 Press return to continue. 


 Ab_free : zero_above_pivot_gj1Ab_mR(Ab_free,r--);
 +1.000  +0.000  +0.000  +0.000  +0.000  +0.000  +0.000  -3.000  -4.000  -2.000 
 +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000 
 +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +0.000  -2.000  +0.000 
 +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000 
 +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000  +1.000 
 +0.000  +0.000  +0.000  +0.000  +0.000  +1.000  +0.000  +0.000  +0.000  +0.000 

 b_free is a basis for the orthogonal complement of A
    +0.000     -3.000     -4.000     -2.000 
    +0.000     +1.000     +0.000     +0.000 
    +0.000     +0.000     -2.000     +0.000 
    +0.000     +0.000     +1.000     +0.000 
    +0.000     +0.000     +0.000     +1.000 
    +0.000     +0.000     +0.000     +0.000 

 Press return to continue. 


 A :
    +1.000     +3.000     -2.000     +0.000     +2.000     +0.000 
    +2.000     +6.000     -5.000     -2.000     +4.000     -3.000 
    +0.000     +0.000     +5.000    +10.000     +0.000    +15.000 
    +2.000     +6.000     +0.000     +8.000     +4.000    +18.000 

 b_free is a basis for the orthogonal complement of A
    +0.000     -3.000     -4.000     -2.000 
    +0.000     +1.000     +0.000     +0.000 
    +0.000     +0.000     -2.000     +0.000 
    +0.000     +0.000     +1.000     +0.000 
    +0.000     +0.000     +0.000     +1.000 
    +0.000     +0.000     +0.000     +0.000 

 The row vectors of A are orthogonal to the column vectors of bfree.

 A * bfree: 
    +0.000     +0.000     +0.000     +0.000 
    +0.000     +0.000     +0.000     +0.000 
    +0.000     +0.000     +0.000     +0.000 
    +0.000     +0.000     +0.000     +0.000 

 Press return to continue.