Aller au contenu

Mathc matrices/05t

Un livre de Wikilivres.


Application


Pinv_Rn_mR(); Pinv_Cn_mR();
/* ------------------------------------ */
/* ------------------------------------ */
double **Pinv_Rn_mR(
double **A,
double **Pinv,
double   FACTOR
)
{
int r = rsize_R(A);
int c = csize_R(A);

double **FA         = smul_mR(FACTOR,A, 
                      i_mR(r,c));
                  
double **tFA        = transpose_mR(FA, 
                      i_mR(c,r));

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

double **tUA        = i_mR(c,c);

double **EValue     = i_mR(c,c);

double **invEValue  = i_mR(c,c);
double **VinvEValue = i_mR(c,c); 

  svd_U_Rn_mR(tFA,U);    
  svd_V_Rn_mR(tFA,V); 
  
/*  EValue = tU A V  */ 
 transpose_mR(U,tU);
       mul_mR(tU,A,tUA);
       mul_mR(tUA,V,EValue);	


   inv_svd_mR(EValue,invEValue);

/* PseudoInverse = V invEValue tU */  
   mul_mR(V,invEValue,VinvEValue);
   mul_mR(VinvEValue,tU,Pinv);    

  f_mR(FA); 
  f_mR(tFA);

  f_mR(U);
  f_mR(tU); 
  f_mR(tUA);

  f_mR(V);  

  f_mR(EValue);

  f_mR(invEValue);
  f_mR(VinvEValue);  
            
 return(Pinv);
}
/* ------------------------------------ */
/* ------------------------------------ */
/* ------------------------------------ */
/* ------------------------------------ */
double **Pinv_Cn_mR(
double **A,
double **Pinv,
double   FACTOR
)
{
int r = rsize_R(A);
int c = csize_R(A);

double **FA          = smul_mR(FACTOR,A,
                       i_mR(r,c));



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

double **tUA         = i_mR(r,c);

double **EValue      = i_mR(r,c);
double **tEValue     = i_mR(c,r);
double **invtEValue  = i_mR(c,r); 
double **VinvtEValue = i_mR(c,r);
	
 svd_U_Cn_mR(FA,U);   
 svd_V_Cn_mR(FA,V);
 
/*  EValue = tU  A  V   */
  transpose_mR(U,tU); 
        mul_mR(tU,A,tUA);
        mul_mR(tUA,V,EValue); 

  transpose_mR(EValue,tEValue);
    inv_svd_mR(tEValue,invtEValue); 

/* PseudoInverse = V invtEValue tU */   
  mul_mR(V,invtEValue,VinvtEValue);
  mul_mR(VinvtEValue,tU,Pinv);  

 f_mR(FA);   


 f_mR(U);
 f_mR(tU);  
 f_mR(tUA);

 f_mR(V);

 f_mR(EValue);
 f_mR(tEValue);
 f_mR(invtEValue);
 f_mR(VinvtEValue); 
    
 return(Pinv);	
}
/* ------------------------------------ */
/* ------------------------------------ */