Mathc complexes/a60
Bibliothèque
Copier la bibliothèque dans votre répertoire de travail avec les fichiers des parties précédentes :
J'ai essayer d'implémenter la fonction SVD (Décomposition en Valeurs Singulières). J'ai raté mon coups et je suis tombé sur cette décomposition.
La décomposition SVD peut travailler sur des matrices carrés ou rectangulaires. Les valeurs singulières sont réelles et positives.
Cette décomposition que je vous propose travaille sur les matrices qui ont un nombre de lignes supérieur ou égal aux nombres de colonnes . Les valeurs "singulières" sont complexes. 
La décomposition par les valeurs propres et vecteurs propres ne fonctionne que sur les matrices symétriques conjuguées. 
Cette version semble fonctionner sur toutes les matrices qui ont un nombre de lignes supérieur ou égal aux nombres de colonnes. 
Pour l'instant je ne connais pas son nom. Je l'ai appelé X pour me facilité la tache. 
Exemple pour tester la bibliothèque :

Mathc complexes/a61
Bibliothèque
Installer ce fichier dans votre répertoire de travail.
/* Save as : wd.h */
/* ------------------------------------ */ 
/* Rand */
/* ------------------------------------ */

Mathc complexes/a62
Bibliothèque
Installer ce fichier dans votre répertoire de travail.
/* Save as : wdx.h */
/* ------------------------------------ */
double **X_U_mZ(
double **A_T,
double **U,
double factor
int r = rsize_Z(A_T);
int c = csize_Z(A_T);
int i;
double **sA_T = smul_mZ(factor,A_T,i_mZ(r,c));
double **sA = ctranspose_mZ(sA_T,i_mZ(c,r));
double **sA_TsA = i_mZ(r,r);
double **sAsA_T = i_mZ(c,c);
double **M_Ualue = i_mZ(r,C1);
double **Ide = eye_mZ(i_mZ(c,c));
double **zIde = i_mZ(c,c);
double **AmnszIde = i_mZ(c,c);
double **Ab ;
double **b = i_mZ(c, C1 );
double **Ab_free = i_Abr_Ac_bc_mZ(c,c,C2);
double **b_free = i_mZ( c, C2);
 mul_mZ(sA_T,sA,sA_TsA);
 eigsuv_mZ(sA_TsA,M_Ualue);
 mul_mZ(sA,sA_T,sAsA_T);
/* ------------------------------------ */
for(i = R1; i <= csize_Z(U); i++)

zmul_mZ(i_Z(M_Ualue[i][C1],M_Ualue[i][C2]),Ide,zIde); 
 MmnsD_mZ(sAsA_T,zIde,AmnszIde);
/* ------------------------------------ */ 
 Ab = c_A_b_Ab_mZ(AmnszIde, b, i_Abr_Ac_bc_mZ(c,c,C1));
/* ------------------------------------ */ 
 GJ_PP_FreeV_m(Ab,Ab_free,b_free); 
 c_c_mZ(b_free,C2,U,i);

Normalizeuv_mZ(U);
 return(U);
/* ------------------------------------ */
double **X_V_mZ(
double **A_T,
double **V,
double factor
int r = rsize_Z(A_T);
int c = csize_Z(A_T);
int i;
double **sA_T = smul_mZ(factor,A_T,i_mZ(r,c));
double **sA = ctranspose_mZ(sA_T, i_mZ(c,r));
double **sA_TsA = i_mZ(r,r);
double **M_Value = i_mZ(r,C1);
double **Ide = eye_mZ(i_mZ(r,r));
double **zIde = i_mZ(r,r);
double **AmnszIde = i_mZ(r,r);
double **Ab ;
double **b = i_mZ(r, C1 );
double **Ab_free = i_Abr_Ac_bc_mZ(r,r,C2);
double **b_free = i_mZ( r, C2);
/* ------------------------------------ */
 mul_mZ(sA_T,sA,sA_TsA);
 eigsuv_mZ(sA_TsA,M_Value);
for(i = R1; i <= csize_Z(V); i++)
 zmul_mZ(i_Z(M_Value[i][C1],M_Value[i][C2]),Ide,zIde); 
 MmnsD_mZ(sA_TsA,zIde,AmnszIde);
 Ab = c_A_b_Ab_mZ(AmnszIde, b, i_Abr_Ac_bc_mZ(r,r,C1)); 
/* ------------------------------------ */ 
 GJ_PP_FreeV_m(Ab,Ab_free,b_free); 
 c_c_mZ(b_free,C2,V,i);

Normalizeuv_mZ(V);
 return(V);
/* ------------------------------------ */
double **X_inv_mZ(
double **M_Value,
double **invM_Value
int r;
int c;
nb_Z a;
 for ( r=R1; r<M_Value[R_SIZE][C0]; r++)
 for ( c=C1; c<M_Value[C_SIZE][C0]; c+=C2)
 if(((r-R1)*C2)==c-C1)
 a = inv_Z(i_Z( M_Value[r][c], M_Value[r][c+C1]));
 invM_Value[r][c ] = a.r;
 invM_Value[r][c+C1] = a.i;

return(invM_Value);
/* ------------------------------------ */

Mathc complexes/a63
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c00a.c */
/* ------------------------------------ */
void fun(int r,int c)
double **A = r_mZ(i_mZ(r,c),99); 
double **A_T = ctranspose_mZ(A,i_mZ(c,r));
double **V = i_mZ(r,c);
double **U = i_mZ(r,c);
double **U_T = i_mZ(c,r); // :c,r 
double **U_TA = i_mZ(c,c); // c,r r,c :c,c
double **U_TA2 = i_mZ(c,r); // c,r :c,r 
double **U_TA2V = i_mZ(c,c); // c,r r,c :c,c X_Value
 clrscrn();
 printf(" A :");
 p_mZ(A, S10,P2, S8,P2, C3);
 X_U_mZ(A_T,U,FACTOR_E);
 printf(" U :");
 p_mZ(U, S10,P4, S8,P4, C3);
 X_V_mZ(A_T,V,FACTOR_E);
 printf(" V :");
 p_mZ(V, S10,P4, S8,P4, C3); 
 ctranspose_mZ(U,U_T);
/* X_Value = U_T * A * V */
 mul_mZ( U_T, A, U_TA); // U_TA : c,c
 c_mZ( U_TA, U_TA2); // U_TA2 : c,r 
 mul_mZ(U_TA2, V, U_TA2V); // V : r,c
 printf(" X_Value = U_T * A * V :");
 p_mZ(U_TA2V, S10,P4, S9,P4, C3);
 f_mZ(A); 
 f_mZ(A_T);
 f_mZ(V); 
 f_mZ(U);
 f_mZ(U_T); 
 f_mZ(U_TA);
 f_mZ(U_TA2); 
 f_mZ(U_TA2V);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(R3,C2);
} while(stop_w());
 return 0;
/* ------------------------------------ */

Exemple de sortie écran :
 A :
 +41.00 +37.00i -40.00 -54.00i 
 -47.00 +31.00i +45.00 -58.00i 
 -83.00 +51.00i -2.00 -19.00i 
 U :
 +0.0181 -0.5519i -0.2096 +0.4125i 
 +0.5973 +0.0221i -0.3806 +0.1671i 
 +0.5813 -0.0000i +0.7830 +0.0000i 
 V :
 -0.7778 +0.2119i +0.5709 -0.1555i 
 +0.5917 +0.0000i +0.8061 +0.0000i 
 +0.0000 +0.0000i +0.0000 +0.0000i 
 X_Value = U_T * A * V :
 +90.4343-117.8444i +0.0000 -0.0000i 
 +0.0000 -0.0000i -52.4464 +34.1130i 
 Press return to continue
 Press X to stop

Mathc complexes/a64
Application
Mathc complexes/a65
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c00b.c */
/* ------------------------------------ */
void fun(int r,int c)
double **A = r_mZ(i_mZ(r,c),99); 
double **A_T = ctranspose_mZ(A,i_mZ(c,r));
double **V = i_mZ(r,c);
double **V_T = i_mZ(c,r);
double **U = i_mZ(r,c);
double **U_T = i_mZ(c,r); // :c,r 
double **U_TA = i_mZ(c,c); // c,r r,c :c,c
double **U_TA2 = i_mZ(c,r); // c,r :c,r 
double **U_TA2V = i_mZ(c,c); // c,r r,c :c,c X_Value
double **A2V = i_mZ(r,c); 
double **A2 = i_mZ(r,r); // A = U * X_Value * V_T 
 clrscrn();
 printf(" A :");
 p_mZ(A, S10,P2, S8,P2, C3);
 X_U_mZ(A_T,U,FACTOR_E);
 printf(" U :");
 p_mZ(U, S10,P4, S8,P4, C3);
 X_V_mZ(A_T,V,FACTOR_E);
 printf(" V :");
 p_mZ(V, S10,P4, S8,P4, C3);
 ctranspose_mZ(U,U_T);
 ctranspose_mZ(V,V_T); 
/* X_Value = U_T * A * V */
 mul_mZ( U_T, A, U_TA); // U_TA : c,c
 c_mZ( U_TA, U_TA2); // U_TA2 : c,r 
 mul_mZ( U_TA2, V, U_TA2V); // V : r,c
 printf(" X_Value = U_T * A * V :");
 p_mZ(U_TA2V, S10,P4, S8,P4, C3);
 stop();
 clrscrn();
/* A = U * X_Value * V_T */ 
 mul_mZ( U, U_TA2V, A2V); // U,U_T = 1;
 mul_mZ(A2V, V_T, A2); // V,V_T = 1;
 printf(" A2 = U * X_Value * V_T : \t\t U * (U_T*A*V) * V_T ");
 p_mZ(A2, S5,P0, S4,P0, C3); 
 printf(" A :");
 p_mZ(A, S5,P0, S4,P0, C3);
 f_mZ(A);
 f_mZ(A_T);
 f_mZ(V);
 f_mZ(V_T);
 f_mZ(U);
 f_mZ(U_T);
 f_mZ(U_TA);
 f_mZ(U_TA2);
 f_mZ(U_TA2V);
 f_mZ(A2V);
 f_mZ(A2);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(R3,C2);
} while(stop_w());
 return 0;
/* ------------------------------------ */
 Exemple de sortie écran :
 A :
 +22.00 +80.00i -73.00 -15.00i 
 +9.00 -7.00i +88.00 -92.00i 
 +5.00 -18.00i -25.00 -19.00i 
 U :
 +0.5221 -0.3083i -0.6079 +0.4780i 
 -0.0842 +0.7742i +0.0225 +0.5309i 
 +0.1608 -0.0000i +0.3458 +0.0000i 
 V :
 -0.0659 +0.2715i +0.2264 -0.9331i 
 +0.9602 +0.0000i +0.2794 +0.0000i 
 +0.0000 +0.0000i +0.0000 +0.0000i 
 X_Value = U_T * A * V :
 -120.9670-97.6634i +0.0000 +0.0000i 
 +0.0000 +0.0000i -65.4946-40.6241i 
 Press return to continue. 
 -----------------------------------------
 A2 = U * X_Value * V_T : U * (U_T*A*V) * V_T 
 +22 +80i -73 -15i +0 +0i 
 +9 -7i +88 -92i +0 +0i 
 +5 -18i -25 -19i +0 +0i 
 A :
 +22 +80i -73 -15i 
 +9 -7i +88 -92i 
 +5 -18i -25 -19i 
 Press return to continue
 Press X to stop