Mathc matrices/c12bn

Un livre de Wikilivres.
Aller à la navigation Aller à la recherche


Sommaire


Installer ce fichier dans votre répertoire de travail.


Crystal Clear mimetype source c.png cb.c
'
/* ------------------------------------ */
/*  Save as :   cb.c                    */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
void X_svd_V_Cn_uv_mR(
double **A,
double **V
)
{
int i;	

int r = rsize_R(A);
int c = csize_R(A);

double **A_T       =         i_mR(c,r);	
double **A_TA      =         i_mR(c,c);

double **EigsValue =         i_mR(c,C1);
double **eignV     =         i_mR(c,c);

double **Ab;
double **b         =   m0_mR(i_mR(c,C1));

double **Ide       =  eye_mR(i_mR(c,c));
double **sIde      =         i_mR(c,c);
double **A_TAmnssIde =         i_mR(c,c);


  eigs_value_AA_T_uv_mR(A,EigsValue);
  transpose_mR(A,A_T);
  
  mul_mR(A_T,A,A_TA);
  
  for(i = R1; i <= rsize_R(EigsValue); i++)
  { 
   if(EigsValue[i][C1])
     {   
      smul_mR(EigsValue[i][C1],Ide,sIde);
      MmnsD_mR(A_TA,sIde,A_TAmnssIde);
      
      Ab = i_Abr_Ac_bc_mR(rsize_R(A_TAmnssIde),
                     csize_R(A_TAmnssIde),
                     csize_R(b));
      
      c_A_b_Ab_mR(A_TAmnssIde,b, Ab); 
               
      gj_freevariable_eignvector_uv_mR(Ab,eignV);
      c_c_mR(eignV,C2,V,i); 
     } 
   else
    {
     /* do not thing if EigsValue = 0*/
    }
  }    
   
  Normalize_uv_mR(V);  

  f_mR(EigsValue);
  f_mR(eignV);
  
  f_mR(A);  
  f_mR(A_TA);
  
  f_mR(Ab);
  f_mR(b);
  
  f_mR(Ide);
  f_mR(sIde);
  f_mR(A_TAmnssIde);
}

/* ------------------------------------ */
/* ------------------------------------ */
void fun(int r,int c)
{
double **A     = r_mR(i_mR(r,c),9.);
double **A_T   =      i_mR(c,r);

double **S = i_mR(r,C1);
double **U = i_mR(r,r);
double **V = i_mR(c,c);

  clrscrn();  
  printf(" Copy/Past into the octave windows \n\n\n");
  p_Octave_mR(A,"a",P2);
  printf(" [U, S, V] =svd (a,10)\n\n\n");
  stop();

  clrscrn(); 
  
  transpose_mR(A,A_T);
   
    svd_U_Cn_uv_mR(A,U); 
  X_svd_V_Cn_uv_mR(A,V); 
    svd_value_uv_mR(A_T,S);
  
  printf(" U :");
  p_mR(U,S5,P5,C10);   
    
  printf(" S :");
  p_mR(S,S5,P5,C10);
   
  printf(" V:");
  p_mR(V,S5,P5,C10);  
    
  f_mR(A);
  f_mR(A_T); 
  f_mR(S); 
  f_mR(U);
  f_mR(V); 
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

int i;

do
{
  i = rp_I(R5)+R1;
  
  fun(i,i+C3);

} while(stop_w());

  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */


Dans cet exemple nous travaillons avec une matrice qui à plus de colonnes que de lignes. Ici trois colonnes de plus (C3).

Chaque colonnes supplémentaires correspondent à une valeur singulière nulle. Ici trois valeurs singulières nulles.

Pour calculer les vecteurs singuliers de ces valeurs, il faut résoudre un système d'équation avec ici trois variables libres.

Cet exemple présente donc ce qui fonctionne et ce qui ne fonctionne pas.

Pas de problème pour calculer le vecteur U et les valeurs singulières. Les valeurs du vecteurs V sont bien calculées sauf les vecteurs qui on une valeur singulière nulle.

Les exemples précédents montrent que la valeur nulle ne pose pas de problème si elle est unique. C'est les valeurs singulières multiples qui me pose un problème.


Exemple de sortie écran :
 ------------------------------------
 Copy/Past into the octave windows 


 a=[
+8.00,-9.00,+8.00,-7.00,-3.00,-5.00,-5.00;
-9.00,+8.00,-3.00,+6.00,-9.00,+2.00,-5.00;
-5.00,-7.00,+8.00,-3.00,+4.00,-3.00,+8.00;
-5.00,+4.00,+6.00,-3.00,-9.00,-1.00,+2.00]

 [U, S, V] =svd (a,10)


 Press return to continue. 


 ------------------------------------
 U :
-0.59881 +0.33998 -0.66439 +0.29057 
+0.67622 +0.36581 -0.15046 +0.62150 
-0.40819 +0.36256 +0.73182 +0.40789 
+0.13244 +0.78686 +0.01982 -0.60243 

 S :
+23.49042 
+15.70570 
+14.15274 
+5.12163 

 V:
-0.40432 +0.40237 +0.54541 +0.44835  -nan  -nan  -nan 
+0.60391 -0.03031 +0.01891 +0.56780  -nan  -nan  -nan 
-0.39548 -0.58858 -0.07841 -0.02120  -nan  -nan  -nan 
+0.38638 +0.23134 -0.10549 -0.44491  -nan  -nan  -nan 
-0.30286 +0.63313 -0.43075 -0.11485  -nan  -nan  -nan 
+0.23152 +0.18101 -0.05693 +0.16227  -nan  -nan  -nan 
-0.14422 -0.06018 -0.70435 +0.48854  -nan  -nan  -nan 


 Press return to continue
 Press X      to stop