Mathc matrices/c05d
Calculer les Valeurs Singulières
Installer et compiler ces fichiers dans votre répertoire de travail.
c05d.c |
---|
/* ------------------------------------ */
/* Save as : c05d.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
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);
svds_mR(A,SvdValue);
}
else
{
SvdValue = i_mR(rA,C1);
svds_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