Mathc matrices/c05b
Application 
Installer et compiler ces fichiers dans votre répertoire de travail.
/* Save as : c00b.c */
void fun(void)
double a[RA*CA]={
 +2, +7, +4, 
 -9, -3, +2, 
 -4, -4, +2, 
 -7, +8, -9, 
 +2, -2, -1
double **A = ca_A_mR(a,i_mR(RA,CA));
double **Q = i_mR(RA,CA);
double **R = i_mR(CA,CA);
 clrscrn();
 printf(" A :");
 p_mR(A,S3,P0,C6); 
 printf(" Copy/Past into the octave windows \n\n");
 p_Octave_mR(A,"a",P0);
 printf(" [Q, R] = qr (a,0) \n\n");
 stop();
 clrscrn();
 QR_uv_mR(A,Q,R); 
 printf(" Q :");
 p_mR(Q,S10,P4,C6); 
 printf(" R :");
 p_mR(R,S10,P4,C6);
 stop();
 clrscrn();
 printf(" A :");
 p_mR(A,S3,P0,C6); 
 printf(" A = Q * R :"); 
 mul_mR(Q,R, A);
 p_mR(A,S10,P4,C6);
 stop(); 
 f_mR(A);
 f_mR(Q);
 f_mR(R);
/* ------------------------------------ */
int main(void)
 fun();
 return 0;
/* ------------------------------------ */
 La matrice A doit avoir plus de lignes que de colonnes ou être carrée

Exemple de sortie écran :
 A :
 +2 +7 +4 
 -9 -3 +2 
 -4 -4 +2 
 -7 +8 -9 
 +2 -2 -1 
 Copy/Past into the octave windows 
 a=[
+2,+7,+4;
-9,-3,+2;
-4,-4,+2;
-7,+8,-9;
+2,-2,-1]
 [Q, R] = qr (a,0) 
 Press return to continue. 
 -----------------------------------
 Q :
 +0.1612 +0.5908 +0.7252 
 -0.7252 -0.2665 +0.3849 
 -0.3223 -0.3423 +0.1799 
 -0.5641 +0.6600 -0.4684 
 +0.1612 -0.1646 -0.2724 
 R :
 +12.4097 -0.2417 +3.4650 
 +0.0000 +11.9139 -4.6301 
 -0.0000 -0.0000 +8.5180 
 Press return to continue. 
 -----------------------------------
 A :
 +2 +7 +4 
 -9 -3 +2 
 -4 -4 +2 
 -7 +8 -9 
 +2 -2 -1 
 A = Q * R :
 +2.0000 +7.0000 +4.0000 
 -9.0000 -3.0000 +2.0000 
 -4.0000 -4.0000 +2.0000 
 -7.0000 +8.0000 -9.0000 
 +2.0000 -2.0000 -1.0000 
 Press return to continue.

Mathc matrices/c05c
Fonctions de bases
Installer et compiler ces fichiers dans votre répertoire de travail.
/* Save as : c05c.c */
void fun(int r,int rn)
double **A = r_mR(i_mR(r+rn,r),9.);
double **A_T = i_mR(r,r+rn);
double **A_TA = i_mR(r,r);
double **SvdValue_2 = i_mR(r,C1);
double **SvdValue = i_mR(r,C1);
 clrscrn();
 printf(" A :");
 p_mR(A,S5,P0,C6); 
 printf(" Copy/Past into the octave windows \n\n\n");
 p_Octave_mR(A,"a",P0);
 printf(" SvdValue = svd (a,10)\n\n\n");
 stop();
 clrscrn();
 printf(" A :");
 p_mR(A,S5,P0,C6); 
 transpose_mR(A,A_T);
 mul_mR(A_T,A, A_TA); 
 eigs_value_uv_mR(A_TA,SvdValue_2);
 printf(" SvdValue^2 :");
 p_mR(SvdValue_2,S13,P4,C1);
 printf(" SvdValue :");
 svd_sqrt_uv_mR(SvdValue_2,SvdValue);
 p_mR(SvdValue,S13,P4,C1); 
 f_mR(A);
 f_mR(A_T);
 f_mR(A_TA);
 f_mR(SvdValue_2);
 f_mR(SvdValue);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(rp_I(R4),rp0_I(R4));
} while(stop_w());
 return 0;
/* ------------------------------------ */
 Vérifier avec octave les calculs.
 Dans cet exemple le nombre de lignes doit être supérieur ou égal au nombre de colonnes. L'exemple suivant corrigera ce problème.

Exemple de sortie écran :
 A :
 -3 +2 +8 
 +2 +6 -3 
 +8 -1 +2 
 -1 -5 +2 
 -7 +2 -1 
 -9 +6 -1 
 Copy/Past into the octave windows 
 a=[
-3,+2,+8;
+2,+6,-3;
+8,-1,+2;
-1,-5,+2;
-7,+2,-1;
-9,+6,-1]
 SvdValue = svd (a,10)
 Press return to continue. 
 Exemple de sortie écran :
 A :
 -3 +2 +8 
 +2 +6 -3 
 +8 -1 +2 
 -1 -5 +2 
 -7 +2 -1 
 -9 +6 -1 
 SvdValue^2 :
 +240.21769 
 +98.54204 
 +58.24027 
 SvdValue :
 +15.49896 
 +9.92683 
 +7.63153 
 Press return to continue
 Press X to stop

Mathc matrices/c05d
Fonctions de bases
Installer et compiler ces fichiers dans votre répertoire de travail.
/* Save as : c05d.c */
void fun(int r,int c)
double **A = r_mR(i_mR(r,c),9.);
double **A_T = i_mR(c,r);
double **SvdValue ;
int rA = rsize_R(A);
int cA = csize_R(A);
 clrscrn();
 printf(" A :");
 p_mR(A,S5,P0,C6); 
 printf(" Copy/Past into the octave windows \n\n\n");
 p_Octave_mR(A,"a",P0);
 printf(" SvdValue = svd (a,10)\n\n\n");
 stop();
 clrscrn(); 
 if( rA>=cA)
 SvdValue = i_mR(cA,C1);
 svd_value_uv_mR(A,SvdValue);
 else
 SvdValue = i_mR(rA,C1);
 svd_value_uv_mR(transpose_mR(A,A_T),SvdValue);

printf(" A :");
 p_mR(A,S5,P0,C6); 
 printf(" SvdValue :");
 p_mR(SvdValue,S13,P4,C1); 
 f_mR(A);
 f_mR(A_T);
 f_mR(SvdValue);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(rp_I(R5),rp_I(R5));
} 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 :
 A :
 +2 -7 -9 +4 +2 
 -7 -9 -3 -3 -5 
 -7 -7 -3 -1 -3 
 -9 +4 +6 +4 -7 
 -1 -5 -7 +6 +6 
 Copy/Past into the octave windows 
 a=[
+2,-7,-9,+4,+2;
-7,-9,-3,-3,-5;
-7,-7,-3,-1,-3;
-9,+4,+6,+4,-7;
-1,-5,-7,+6,+6]
 SvdValue = svd (a,10)
 Press return to continue. 
 Exemple de sortie écran :
 A :
 +2 -7 -9 +4 +2 
 -7 -9 -3 -3 -5 
 -7 -7 -3 -1 -3 
 -9 +4 +6 +4 -7 
 -1 -5 -7 +6 +6 
 SvdValue :
 +19.78076 
 +17.33390 
 +9.24514 
 +3.41381 
 +0.36131 
 Press return to continue
 Press X to stop

Mathc matrices/a04
Copier la bibliothèque dans votre répertoire de travail :
Exemple pour tester la bibliothèque :

Mathc matrices/a03
Copier la bibliothèque dans votre répertoire de travail :
Exemple pour tester la bibliothèque :

Mathc matrices/a02
Copier la bibliothèque dans votre répertoire de travail :
Nous n'avons pas encore introduit les fonctions permettant de visualiser les matrices. 
On peut vérifier en aveugle si la compilation ce passe correctement.
Exemple pour tester la bibliothèque :

Mathc matrices/a01
Bibliothèque
Copier la bibliothèque dans votre répertoire de travail :
Exemple pour tester la bibliothèque :

Mathc matrices/b01
Étude du code
Étude de quelques fonctions :

Mathc matrices/b02
Étude du code
Étude de quelques fonctions :

Mathc matrices/b03
Application 
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c00b.c */
void fun(void)
double a[RA*CA]={
 +381, +184, +659, -768, -313, +623, +2, 
 +352, +26, +346, -675, -421, -595, -364 
double tb[RA*Cb]={
 -286, 
 +33 
double **A = ca_A_mR(a, i_mR(RA,CA )); 
double **b = ca_A_mR(tb,i_mR(RA,C1)); 
double **Ab = i_Abr_Ac_bc_mR(RA,CA,Cb);
double **new_Ab = i_Abr_Ac_bc_mR(csize_A_R(Ab), 
 csize_A_R(Ab),
 csize_R(A)-rsize_R(A) + Cb); 
double **new_b = i_mR(rsize_R(new_Ab),csize_b_R(new_Ab)); 
 clrscrn();
 printf(" A :");
 P_mR(A,S8,P0,C7);
 printf(" b :");
 p_mR(b,S8,P0,C7);
 printf(" Ab :");
 c_A_b_Ab_mR(A,b,Ab);
 p_mR(Ab,S8,P0,C7);
 stop();
 clrscrn();
 GJ_TP_mR(Ab);
 printf(" Ab :");
 p_mR(Ab,S10,P4,C7);
 stop(); 
 clrscrn();
 GJ_TPfreeV_mR(Ab,new_Ab); 
 printf(" new_Ab :"); 
 p_mR(new_Ab,S10,P4,C7);
 stop(); 
 clrscrn();
 c_Ab_b_mR(new_Ab,new_b);
 printf(" new_b :"); 
 p_mR(new_b,S10,P4,C7);
 printf(" new_b : free variables");
 p_freeV(new_b,S8,P4);
 stop();
 f_mR(new_Ab); 
 f_mR(Ab);
 f_mR(b);
 f_mR(A);
/* ------------------------------------ */
int main(void)
 fun();
 return 0;
/* ------------------------------------ */
Nous utilisons la fonction GJ_TP_mR(Ab); pour résoudre ce système.