Mathc matrices/c12b14

Un livre de Wikilivres.


Application


Installer ce fichier dans votre répertoire de travail.


ccn4e.c
/* ------------------------------------ */
/*  Save as :   ccn4e.c                 */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
void fun(int r,int c)
{
double **A    = r_mR(i_mR(r,c),9.);
double **a    = i_mR(r,c);

double **U     = i_mR(r,r);
double **V     = i_mR(c,c);
double **U_T   = i_mR(r,r);
double **V_T   = i_mR(c,c);

double **U_TA  = i_mR(r,c);  /* rr rc */
double **S     = i_mR(r,c);
double **US    = i_mR(r,c);  /* rr rc */

  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(); 
  svd_U_Cn_mR(A,U);   
  svd_V_Cn_mR(A,V);      
  printf(" U :");
  p_mR(U ,S10,P6,C10);
  stop();

  clrscrn();    
  printf(" V ");
  p_mR(V,S10,P6,C6); 
  stop();

  clrscrn(); 
  transpose_mR( U,U_T);
  
/* S = U_T * A * V */
  mul_mR(U_T,A,U_TA);
  mul_mR(U_TA,V,S);
  
  printf(" S = U_T * A * V :");
  p_mR(S,S10,P5,C6); 
  stop();
  
  clrscrn();
  
  transpose_mR(V,V_T);
  
/* A = U * S * V_T */
  mul_mR(U,S,US);
  mul_mR(US,V_T,a);
  
  printf(" A :");
  p_mR(A ,S10,P6,C6); 
  printf(" a = U * S * V_T ");
  p_mR(a,S10,P6,C6);   
  
  f_mR(A);
  f_mR(a);  
  
  f_mR(U);
  f_mR(V); 
  f_mR(U_T);
  f_mR(V_T); 
  
  f_mR(U_TA);
  
  f_mR(S);   
  f_mR(US);   
 
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

int i;

do
{
  i = rp_I(R3)+R1;
  
  fun(i,i+C4);

} while(stop_w());

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


Vérifiez le résultat avec octave.

Dans cet exemple on vérifie que A = U * S * V_T.

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


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

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


 Press return to continue. 


 ------------------------------------ 
 U :
 +0.529990  +0.810010  +0.127002  -0.216485 
 +0.576012  -0.533518  -0.052847  -0.617070 
 -0.321263  -0.022415  +0.877384  -0.355647 
 +0.533021  -0.242363  +0.459646  +0.667738 

 Press return to continue. 


 ------------------------------------ 
 V 
 -0.101109  +0.509407  +0.228805  -0.502911  -0.615152  -0.079441 
 +0.512313  -0.158839  -0.199675  -0.434900  +0.000000  +0.634664 
 +0.031420  -0.370988  +0.553102  +0.095229  -0.346294  +0.193358 
 -0.567576  -0.066204  +0.023771  -0.180566  +0.000000  +0.000000 
 +0.622336  +0.065576  +0.066767  +0.074132  -0.182130  -0.604496 
 +0.031420  -0.370988  +0.553102  +0.095229  +0.000000  +0.000000 
 +0.085188  +0.582559  +0.180581  +0.605183  -0.018275  +0.433692 
 +0.092931  +0.303235  +0.508234  -0.368048  +0.684225  +0.000000 

 -0.114849  +0.000000 
 -0.000000  +0.000000 
 -0.082383  -0.707107 
 +0.741276  -0.000000 
 +0.653524  -0.000000 
 +0.000000  +0.707107 
 +0.058641  +0.000000 
 -0.000000  -0.000000 

 Press return to continue. 


 ------------------------------------ 
 S = U_T * A * V :
 -24.06463   -0.00000   +0.00000   +0.00000   +0.00000   +0.00000 
  -0.00000  +18.65327   -0.00000   -0.00000   +0.00000   +0.00000 
  +0.00000   -0.00000  -15.58669   -0.00000   -0.00000   +0.00000 
  -0.00000   +0.00000   +0.00000   -4.89942   +0.00000   +0.00000 

  -0.00000   -0.00000 
  +0.00000   +0.00000 
  -0.00000   -0.00000 
  -0.00000   -0.00000 

 Press return to continue. 

 ------------------------------------ 
 A :
 +8.000000  -9.000000  -7.000000  +6.000000  -7.000000  -7.000000 
 -5.000000  -7.000000  +4.000000  +8.000000  -9.000000  +4.000000 
 -5.000000  +6.000000  -7.000000  -5.000000  +4.000000  -7.000000 
 -1.000000  -3.000000  -3.000000  +8.000000  -9.000000  -3.000000 

 +8.000000  +2.000000 
 -5.000000  -5.000000 
 -1.000000  -7.000000 
 -7.000000  -5.000000 

 a = U * S * V_T 
 +8.000000  -9.000000  -7.000000  +6.000000  -7.000000  -7.000000 
 -5.000000  -7.000000  +4.000000  +8.000000  -9.000000  +4.000000 
 -5.000000  +6.000000  -7.000000  -5.000000  +4.000000  -7.000000 
 -1.000000  -3.000000  -3.000000  +8.000000  -9.000000  -3.000000 

 +8.000000  +2.000000 
 -5.000000  -5.000000 
 -1.000000  -7.000000 
 -7.000000  -5.000000 


 Press return to continue
 Press X      to stop