Mathc matrices/c12a8
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.