< Mathc matrices
Installer et compiler ces fichiers dans votre répertoire de travail. Installer ce fichier dans votre répertoire de travail.
vbdotu.h ' |
---|
/* ------------------------------------ */
/* Save as : vbdotu.h */
/* ------------------------------------ */
/* ------------------------------------ */
/* ------- u.v = v^t u ---------------- */
/* ------------------------------------ */
double dotuv_R(
double **u,
double **v
)
{
double **vt = i_mR(R1, rsize_mR(v));
double **vtu = i_mR(R1, C1);
double udotv;
transpose_mR(v,vt);
mul_mR(vt,u,vtu);
udotv = vtu[R1][C1];
f_mR(vt);
f_mR(vtu);
return (udotv);
}
/* ------------------------------------ */
/* ------ ||u|| = (u.u)^(1/2) ------- */
/* ------------------------------------ */
double normuv_R(
double **u
)
{
return (pow(dotuv_R(u,u),(1./2.)));
}
/* ------------------------------------ */
/* -- d(u,v) = ||u-v|| -- */
/* ------------------------------------ */
double distuv_R(
double **u,
double **v
)
{
double **umnsv = i_mR(rsize_mR(v),csize_mR(v));
double d;
sub_mR(u,v,umnsv);
d = normuv_R(umnsv);
f_mR(umnsv);
return (d);
}
/* ------------------------------------ */
/* (<u,v>/||v||^2) * v */
/* ------------------------------------ */
double **projuv_mR(
double **u,
double **v,
double **projuv
)
{
/* <u,v> / ||v||^2 */
double s = dotuv_R(u,v) / dotuv_R(v,v);
smul_mR(s,v,projuv);
return(projuv);
}
/* ------------------------------------ */
/* ------------------------------------ */
double **orthuv_mR(
double **U,
double **Orth
)
{
double **Vect_U = i_mR(rsize_mR(U),C1);
double **Vect_T = i_mR(rsize_mR(U),C1);
double **Vect_Orth = i_mR(rsize_mR(U),C1);
double **Vect_projuv = i_mR(rsize_mR(U),C1);
int c_U;
int c_Orth;
c_c_mR(U,C1, Orth,C1);
for( c_U = C2; c_U < U[C_SIZE][C0]; c_U++)
{
c_c_mR(U,c_U, Vect_U,C1);
c_c_mR(U,c_U, Vect_T,C1);
for( c_Orth = C1; c_Orth < c_U; c_Orth++)
{
c_c_mR(Orth,c_Orth, Vect_Orth,C1);
projuv_mR(Vect_U,Vect_Orth,Vect_projuv);
sub_mR(Vect_T,Vect_projuv,Vect_Orth);
c_mR(Vect_Orth,Vect_T);
}
c_c_mR(Vect_T,C1, Orth,c_Orth);
}
f_mR(Vect_U);
f_mR(Vect_T);
f_mR(Vect_Orth);
f_mR(Vect_projuv);
return(Orth);
}
/* ------------------------------------ */
/* ------------------------------------ */
double **Normalizeuv_mR(
double **Orth
)
{
double **u = i_mR(rsize_mR(Orth),C1);
double **Nu = i_mR(rsize_mR(Orth),C1);
int c_Orth = csize_mR(Orth);
int c;
for( c = C1; c <= c_Orth; c++)
{
c_c_mR(Orth,c, u,C1);
smul_mR(1./normuv_R(u),u,Nu);
c_c_mR(Nu,C1, Orth,c);
}
f_mR(u);
f_mR(Nu);
return(Orth);
}
/* ------------------------------------ */
/* ------------------------------------ */
double **normalizeuv_mR(
double **Orth,
double **Norm
)
{
double **u = i_mR(rsize_mR(Orth),C1);
double **Nu = i_mR(rsize_mR(Orth),C1);
int c_Orth = csize_mR(Orth);
int c;
for( c = C1; c <= c_Orth; c++)
{
c_c_mR(Orth,c, u,C1);
smul_mR(1./normuv_R(u),u,Nu);
c_c_mR(Nu,C1, Norm,c);
}
f_mR(u);
f_mR(Nu);
return(Norm);
}
/* ------------------------------------ */
/* The number of rows of U must be superior
or equal of the number of columns of U */
/* ------------------------------------ */
void QRuv_mR(
double **U,
double **Q,
double **R)
{
double **Q_T = i_mR(csize_mR(Q),rsize_mR(Q));
orthuv_mR(U,Q);
Normalizeuv_mR(Q);
transpose_mR(Q,Q_T);
mul_mR(Q_T,U, R);
}
/* ------------------------------------ */
/* ------------------------------------ */
void r_Quv_mR(
double **U,
double **Q)
{
orthuv_mR(U,Q);
Normalizeuv_mR(Q);
}
/* ------------------------------------ */
double **eigsuv_mR(
double **A,
double **EigsValue
)
{
int r = rsize_mR(A);
double **T = i_mR(r,r);
double **Q = i_mR(r,r);
double **R = i_mR(r,r);
int i;
int rc;
c_mR(A,T);
for(i=0;i<1000;i++)
{
QRuv_mR(T,Q,R);
mul_mR(R,Q,T);
}
for(rc=R1;rc<=r;rc++)
{
EigsValue[rc][C1] = T[rc][rc];
}
f_mR(T);
f_mR(Q);
f_mR(R);
return(EigsValue);
}
/* ------------------------------------ */
double **svduv_mR(
double **A,
double **SvdValue)
{
int rA = rsize_mR(A);
int cA = csize_mR(A);
double **A_T = i_mR(cA,rA);
double **S = i_mR(cA,cA);
double **SvdValue_2 = i_mR(cA,C1);
transpose_mR(A,A_T);
mul_mR(A_T,A, S);
eigsuv_mR(S,SvdValue_2);
sqrt_mR(SvdValue_2,SvdValue);
f_mR(A_T);
f_mR(S);
f_mR(SvdValue_2);
return(SvdValue);
}
/* ------------------------------------ */
/* ------------------------------------ */
Déclaration des fichiers h.
Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.