Exemple de sortie écran :
 Copy/Past into the octave windows 
 a=[
-7.0-1*i,-5.0-7*i,+6.0+4*i,-5.0+2*i;
-7.0-9*i,+4.0+8*i,-3.0-1*i,-3.0-9*i;
+8.0-5*i,-5.0+4*i,-3.0-5*i,-5.0-1*i;
-1.0-3*i,-3.0+6*i,+2.0+4*i,-1.0-7*i;
+4.0-5*i,+2.0-9*i,+6.0+6*i,-9.0-1*i;
-5.0-1*i,-9.0-5*i,-1.0-9*i,-3.0+6*i;
+2.0-7*i,-7.0-5*i,-9.0-3*i,-5.0-7*i]
 [Q, R] = qr (a,0) 
 A :
 -7 -1i -5 -7i +6 +4i -5 +2i 
 -7 -9i +4 +8i -3 -1i -3 -9i 
 +8 -5i -5 +4i -3 -5i -5 -1i 
 -1 -3i -3 +6i +2 +4i -1 -7i 
 +4 -5i +2 -9i +6 +6i -9 -1i 
 -5 -1i -9 -5i -1 -9i -3 +6i 
 +2 -7i -7 -5i -9 -3i -5 -7i 
 Press return to continue. 
 Q :
 -0.35044 -0.05006i -0.22523 -0.35644i 
 -0.35044 -0.45056i +0.22580 +0.30780i 
 +0.40050 -0.25031i -0.18625 +0.22186i 
 -0.05006 -0.15019i -0.11762 +0.25995i 
 +0.20025 -0.25031i +0.12346 -0.38464i 
 -0.25031 -0.05006i -0.40250 -0.25489i 
 +0.10013 -0.35044i -0.27006 -0.21928i 
 +0.19072 +0.28365i +0.05021 -0.17398i 
 +0.02432 -0.26812i +0.02191 -0.42605i 
 +0.00292 -0.15393i -0.54497 +0.17013i 
 +0.26921 +0.26159i -0.03948 -0.45425i 
 +0.23149 +0.33921i -0.29181 +0.12954i 
 -0.16300 -0.38686i -0.08163 +0.07634i 
 -0.54715 -0.04276i -0.19873 -0.31218i 
 R :
 +19.97498 +0.00000i -0.45056 -2.65332i 
 -0.00000 +0.00000i +22.31047 -0.00000i 
 +0.00000 +0.00000i +0.00000 +0.00000i 
 -0.00000 +0.00000i +0.00000 +0.00000i 
 -0.90113 -3.30413i +6.95870 -7.15895i 
 +0.70940 +7.79465i -2.18999 -6.93348i 
 +16.94140 -0.00000i -1.22692 +2.68011i 
 -0.00000 -0.00000i +15.32215 -0.00000i 
 Press return to continue. 
 A :
 -7 -1i -5 -7i +6 +4i -5 +2i 
 -7 -9i +4 +8i -3 -1i -3 -9i 
 +8 -5i -5 +4i -3 -5i -5 -1i 
 -1 -3i -3 +6i +2 +4i -1 -7i 
 +4 -5i +2 -9i +6 +6i -9 -1i 
 -5 -1i -9 -5i -1 -9i -3 +6i 
 +2 -7i -7 -5i -9 -3i -5 -7i 
 A = Q * R :
 -7 -1i -5 -7i +6 +4i -5 +2i 
 -7 -9i +4 +8i -3 -1i -3 -9i 
 +8 -5i -5 +4i -3 -5i -5 -1i 
 -1 -3i -3 +6i +2 +4i -1 -7i 
 +4 -5i +2 -9i +6 +6i -9 -1i 
 -5 -1i -9 -5i -1 -9i -3 +6i 
 +2 -7i -7 -5i -9 -3i -5 -7i 
 Press return to continue
 Press X to stop

Mathc complexes/c05b
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c01b.c */
void fun(int r)
double **A = r_mZ(i_mZ(r,r),9.);
double **EigsValue = i_mZ(r,C1);
 clrscrn();
 printf(" Copy/Past into the octave windows \n\n\n");
 p_Octave_mZ(A,"a",P0,P0); 
 printf(" EigenValues = eigs (a,10) \n\n\n");
 stop();
 clrscrn();
 printf(" A :");
 p_mZ(A, S2,P0, S2,P0, C10); 
 eigsuv_mZ(A,EigsValue);
 printf(" EigsValue :");
 p_mZ(EigsValue, S10,P4, S10,P4, C3); 
 f_mZ(A);
 f_mZ(EigsValue);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(rp_I(R2)+R6);
} while(stop_w());
 return 0;
/* ------------------------------------ */
Je veux calculer les valeurs propres de la matrice M.
J'utilise la QR décomposition de M 
 - Puis je calcule RQ 
 - RQ devient la nouvelle valeur de M 
 - Et je recommence un cycle.
Je copie M dans T pour ne pas modifier M. Puis j'applique 1000 fois l'algorithme vue plus haut. 
 c_mZ(M,T);
 for(i=0;i<1000;i++)
 QRuv_mZ(T,Q,R); 
 mul_mZ(R,Q,T);

À la fin je trouve sur la diagonale de T les valeurs propres.

Exemple de sortie écran :
 Copy/Past into the octave windows 
 a=[
-9.0-5*i,+4.0+6*i,-7.0-5*i,+6.0-5*i,-9.0+2*i,+6.0+8*i,+8.0-1*i,-9.0-5*i;
-7.0+4*i,+4.0+8*i,-5.0-9*i,+4.0-1*i,+6.0+6*i,-1.0-1*i,-9.0+8*i,-5.0+8*i;
+2.0-9*i,+4.0+6*i,+2.0-1*i,-1.0+8*i,-9.0+4*i,+4.0-5*i,+4.0+4*i,-7.0-9*i;
-7.0-9*i,-5.0-9*i,+6.0+8*i,-9.0+2*i,+4.0-9*i,-3.0-1*i,+6.0-5*i,-7.0-7*i;
+2.0+8*i,-3.0-3*i,+6.0+2*i,-9.0-3*i,-5.0-3*i,+8.0-7*i,+4.0-3*i,+4.0-9*i;
+2.0+8*i,+8.0+8*i,+4.0+6*i,-9.0-5*i,-5.0-9*i,+6.0-1*i,-5.0-1*i,-5.0+6*i;
+8.0+6*i,-7.0-5*i,-5.0+4*i,-7.0-9*i,+6.0-3*i,+4.0+8*i,+6.0-7*i,-7.0-7*i;
-3.0-3*i,-3.0+6*i,+8.0-3*i,+2.0+4*i,-9.0-5*i,+2.0+4*i,-3.0-5*i,+8.0-1*i]
 EigenValues = eigs (a,10) 
 Press return to continue. 
 A :
-9-5i +4+6i -7-5i +6-5i -9+2i +6+8i +8-1i -9-5i 
-7+4i +4+8i -5-9i +4-1i +6+6i -1-1i -9+8i -5+8i 
+2-9i +4+6i +2-1i -1+8i -9+4i +4-5i +4+4i -7-9i 
-7-9i -5-9i +6+8i -9+2i +4-9i -3-1i +6-5i -7-7i 
+2+8i -3-3i +6+2i -9-3i -5-3i +8-7i +4-3i +4-9i 
+2+8i +8+8i +4+6i -9-5i -5-9i +6-1i -5-1i -5+6i 
+8+6i -7-5i -5+4i -7-9i +6-3i +4+8i +6-7i -7-7i 
-3-3i -3+6i +8-3i +2+4i -9-5i +2+4i -3-5i +8-1i 
 EigsValue :
 +0.22209 +24.55276i 
 +0.14816 -24.50274i 
 +10.87005 -14.17281i 
 +13.23232 -0.30091i 
 -5.57508 +11.33595i 
 -12.41172 -0.64196i 
 -9.60697 -6.88467i 
 +6.12115 +2.61438i 
 Press return to continue
 Press X to stop

Mathc complexes/c05c
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c01c.c */
void fun(int r,int c)
double **A = r_mZ(i_mZ(r,c),9.);
double **A_T = i_mZ(c,r);
double **SvdValue = i_mZ(r,C1);
int rA = rsize_Z(A);
int cA = csize_Z(A);
 clrscrn();
 printf(" Copy/Past into the octave windows \n\n\n");
 p_Octave_mZ(A,"a",P0,P0); 
 printf(" SvdValue = svd (a,10)\n\n\n");
 stop();
 clrscrn();
 printf(" A :");
 p_mZ(A, S2,P0, S2,P0, C10); 
 if( rA>=cA)
 SvdValue = i_mZ(cA,C1);
 svduv_mZ(A,SvdValue);
 else
 SvdValue = i_mZ(rA,C1);
 svduv_mZ(transpose_mZ(A,A_T),SvdValue);

printf(" SvdValue :");
 p_mZ(SvdValue, S10,P4, S10,P4, C3); 
 f_mZ(A);
 f_mZ(A_T);
 f_mZ(SvdValue);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(rp_I(R2)+R2,rp_I(R2)+R2);
} while(stop_w());
 return 0;
/* ------------------------------------ */
Je veux calculer les valeurs singulières de la matrice M.
Méthode 1 :
 - Je calcule M_t*M
 - Je calcule les valeurs propres de M_t*M.
 - Je calcule la racine carrée de chaque valeur propre et j'obtiens les valeurs singulières.
Méthode 2 :
 - Je calcule M*M_T
 - Je calcule les valeurs propres de M*M_T.
 - Je calcule la racine carrée de chaque valeur propre et j'obtiens les valeurs singulières.
Remarque :
- M_t*M et M*M_T sont des matrices symétriques. Elles ont donc des valeurs propres réelles. Et par chance elles sont positives.
On peut donc toujours en prendre la racine carrée.
- M_t*M et M*M_T n'ont pas en générale la même taille. L'une a donc plus de valeurs propres que l'autre. Ce n'est pas un problème car les valeurs propres supplémentaires sont toujours nulles.
Mon travail fonctionne bien quand le nombres de lignes est supérieur ou égale aux nombres de colonnes. voir le code. On choisie donc soit de travailler directement sur la matrice M ou sur sa transposé M_T

Exemple de sortie écran :
 Copy/Past into the octave windows 
 a=[
+4.0-7*i,-1.0+8*i,-1.0+2*i,-1.0+2*i,+6.0+4*i,+2.0-1*i,-1.0+8*i,-3.0-7*i;
-1.0+8*i,-9.0-7*i,+8.0+8*i,+6.0+8*i,-1.0+8*i,-5.0+8*i,+8.0-1*i,+6.0+2*i;
-5.0+4*i,-9.0-5*i,+6.0+8*i,+4.0-9*i,-9.0+4*i,-7.0-9*i,-9.0-9*i,+4.0-9*i;
-5.0+4*i,-7.0-3*i,-9.0-1*i,-9.0-9*i,+6.0+2*i,-7.0+4*i,+2.0+4*i,-5.0+6*i;
-5.0-3*i,-9.0-1*i,+8.0-1*i,-7.0-7*i,+2.0+4*i,-7.0+2*i,+2.0-1*i,-1.0+4*i;
+2.0-5*i,-5.0-1*i,-5.0+4*i,+8.0-1*i,-5.0-3*i,+2.0+4*i,+4.0-7*i,-7.0-9*i;
-7.0+6*i,-7.0-5*i,-5.0-5*i,+2.0+6*i,+6.0+6*i,-5.0-5*i,-5.0+4*i,-9.0+4*i;
+6.0+4*i,-3.0+2*i,-7.0-1*i,-9.0-9*i,-3.0+2*i,-3.0-7*i,+6.0-9*i,+4.0-1*i]
 SvdValue = svd (a,10)
 Press return to continue.

A :
+4-7i -1+8i -1+2i -1+2i +6+4i +2-1i -1+8i -3-7i 
-1+8i -9-7i +8+8i +6+8i -1+8i -5+8i +8-1i +6+2i 
-5+4i -9-5i +6+8i +4-9i -9+4i -7-9i -9-9i +4-9i 
-5+4i -7-3i -9-1i -9-9i +6+2i -7+4i +2+4i -5+6i 
-5-3i -9-1i +8-1i -7-7i +2+4i -7+2i +2-1i -1+4i 
+2-5i -5-1i -5+4i +8-1i -5-3i +2+4i +4-7i -7-9i 
-7+6i -7-5i -5-5i +2+6i +6+6i -5-5i -5+4i -9+4i 
+6+4i -3+2i -7-1i -9-9i -3+2i -3-7i +6-9i +4-1i 
 SvdValue :
 +37.18165 -0.00000i 
 +31.90760 +0.00000i 
 +26.89274 +0.00000i 
 +20.59610 -0.00000i 
 +17.42731 -0.00000i 
 +12.12789 +0.00000i 
 +10.22487 -0.00000i 
 +5.71546 +0.00000i 
 Press return to continue
 Press X to stop

Mathc complexes/a01
Bibliothèque
Exemple pour tester la bibliothèque :

Mathc complexes/a01b
Bibliothèque
Exemple pour tester la bibliothèque :