Aller au contenu

Mathc matrices/c12a8

Un livre de Wikilivres.


Application


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


c01c.c
/* ------------------------------------ */
/*  Save as :   c01c.c                   */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
#define   RA R3
#define   CA C2
/* ------------------------------------ */
void fun(void)
{
double tA[RA*CA]={
 1, -1, 
 3,  2, 
-2,  4
};


double **A          = ca_A_mR(tA,i_mR(RA,CA));
double **A_T        =            i_mR(CA,RA);
double **A_TA       =            i_mR(CA,CA);  
double **invA_TA    =            i_mR(CA,CA);  
double **invA_TAA_T =            i_mR(CA,RA);  
double **Ide        =            i_mR(CA,CA);  

  clrscrn();
  printf(" A :");
  p_mR(A,S7,P2,C7);
  
  printf(" A_T :");
  p_mR(transpose_mR(A,A_T),S7,P1,C7);
  printf(" A_TA :");
  p_mR(mul_mR(A_T,A,A_TA),S7,P1,C7);  
  stop();
  
  clrscrn();  
  printf(" inv(A_TA) :");
  p_mR(inv_mR(A_TA,invA_TA),S8,P4,C7);  
  printf(" Pseudo Inverse = inv(A_TA)*A_T :");
  pE_mR(mul_mR(invA_TA,A_T,invA_TAA_T),S12,P4,C10); 
  printf(" Ide = (inv(A_TA)*A_T) * A ");   
  mul_mR(invA_TAA_T,A,Ide); 
  p_mR(Ide,S8,P2,C10);  
  stop();  
  
  f_mR(A);

  f_mR(A_T);
  f_mR(A_TA);        
  f_mR(invA_TA);     
  f_mR(invA_TAA_T);  
    
  f_mR(Ide); 
}
/* ------------------------------------ */
int main(void)
{
	
  fun();

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


Un deuxième algorithme pour calculer le pseudo inverse d'une matrice sans utiliser SVD.

  Pseudo Inverse = inv(A_TA)*A_T

Il faut cependant pour cette version que inv(A_TA); soit inversible.


Exemple de sortie écran :
 ------------------------------------ 
 A :
  +1.00   -1.00 
  +3.00   +2.00 
  -2.00   +4.00 

 A_T :
   +1.0    +3.0    -2.0 
   -1.0    +2.0    +4.0 

 A_TA :
  +14.0    -3.0 
   -3.0   +21.0 

 Press return to continue. 


 ------------------------------------ 
 inv(A_TA) :
 +0.0737  +0.0105 
 +0.0105  +0.0491 

 Pseudo Inverse = inv(A_TA)*A_T :
 +6.3158e-02  +2.4211e-01  -1.0526e-01 
 -3.8596e-02  +1.2982e-01  +1.7544e-01 

 Ide = (inv(A_TA)*A_T) * A 
   +1.00    +0.00 
   +0.00    +1.00 

 Press return to continue.