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);
}
/* ------------------------------------ */
/* ------------------------------------ */