Calculer les Valeurs Singulières


Installer et compiler ces fichiers dans votre répertoire de travail.

c05c.c
/* ------------------------------------ */
/*  Save as :   c05c.c                  */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
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,%d)\n\n\n",r);
  stop();
  
  clrscrn();
  printf(" A :");
  p_mR(A,S5,P0,C6);  
  
  transpose_mR(A,A_T);
  mul_mR(A_T,A, A_TA);   
  
  eigs_mR(A_TA,SvdValue_2);
  printf(" SvdValue^2 :");
  p_mR(SvdValue_2,S13,P4,C1);

  printf(" SvdValue :");
  sqrt_svd_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;
}
/* ------------------------------------ */
/* ------------------------------------ */


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.


Exemple de sortie écran :
 A :
   -4    -2    -6    +8 
   -1    +6    +7    -9 
   -5    +4    +2    +6 
   -8    +5    -5    +8 
   -3    -5    -2    +6 
   -9    +5    +9    -3 
   +8    -7    -6    -3 

 Copy/Past into the octave windows 


 a=[
-4,-2,-6,+8;
-1,+6,+7,-9;
-5,+4,+2,+6;
-8,+5,-5,+8;
-3,-5,-2,+6;
-9,+5,+9,-3;
+8,-7,-6,-3]

 SvdValue = svd (a,4)


 Press return to continue. 



 A :
   -4    -2    -6    +8 
   -1    +6    +7    -9 
   -5    +4    +2    +6 
   -8    +5    -5    +8 
   -3    -5    -2    +6 
   -9    +5    +9    -3 
   +8    -7    -6    -3 

 SvdValue^2 :
    +476.6974 
    +438.1925 
     +43.8704 
     +15.2396 

 SvdValue :
     +21.8334 
     +20.9330 
      +6.6235 
      +3.9038 


 Press   return to continue
 Press X return to stop