Linear Algebra and the C Language/a0a8


Code study: orth_mR();

The Gram-Schmidt Algorithm
 

 U = {u1,u2,u3,u4}          A basis of U given in the exercise.
  
 V = {v1,v2,v3,v3}          The orthonormal basis, calculated by the Gram-Schmidt algorithm.

                               <u.v>
 The projection of u onto v = -------- v
                               |v||**2
              
  

 a) v1 = u1
 
               <u2.v1>
 b) v2 = u2 - ---------  v1
              ||v1||**2
              
              
               <u3.v1>         <u3.v2>
 c) v3 = u3 - ---------  v1 - ---------  v2
              ||v1||**2       ||v2||**2 
              
  
               <u4.v1>         <u4.v2>          <u4.v3>
 c) v4 = u4 - ---------  v1 - ---------  v2  - ---------  v3
              ||v1||**2       ||v2||**2        ||v3||**2 
                           
                           
  It is then necessary to normalize the vectors v to obtain an orthonormal basis.  
 


/* ------------------------------------ */
/* ------------------------------------ */
double **orth_mR(
double **U,
double **Q,
int      Normal  /* Normalize : YES = 1, NO = 0 */
)
{
double **u  = i_mR(rsize_R(U),C1);
double **v  = i_mR(rsize_R(U),C1);

double **q  = i_mR(rsize_R(U),C1);

double **projuv = i_mR(rsize_R(U),C1);
double **tq     = i_mR(rsize_R(U),C1);


int c_U;	
int c_Q;

  c_c_mR(U,C1, Q,C1);    
 
  for( c_U = C2; c_U < U[C_SIZE][C0]; c_U++)
      {
		c_c_mR(U,c_U, u,C1);
		c_c_mR(U,c_U, q,C1);

		for( c_Q = C1; c_Q < c_U; c_Q++)
          {		
		    c_c_mR(Q,c_Q, v,C1); 

		    proj_mR(u,v, projuv);      /* [<u,v> / ||v||^2] * v */		                		        
		        sub_mR(q,   projuv, tq);		    
		          c_mR(             tq, q);    
	      }
	      c_c_mR(q,C1, Q,c_Q);		
	  }
	  
  if(Normal) Normalize_mR(Q); 
	    
  f_mR(u);
  f_mR(v);
  f_mR(q); 
  
  f_mR(projuv);  
  f_mR(tq);
           
 return(Q);
}
/* ------------------------------------ */
/* ------------------------------------ */