Mathc matrices/c12a9
Apparence
Installer et compiler ces fichiers dans votre répertoire de travail.
c01d.c |
---|
/* ------------------------------------ */
/* Save as : c01d.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define RA R3
#define CA C2
/* ------------------------------------ */
/* ------------------------------------ */
void fun(void)
{
double **A = r_mR(i_mR(RA,CA),9);
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);
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)
{
time_t t;
srand(time(&t));
do
{
fun();
} while(stop_w());
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.
Cette version propose des valeurs aléatoires.
Exemple de sortie écran :
------------------------------------
A :
+7.00 +3.00
-1.00 -9.00
+9.00 -6.00
A_T :
+7.0 -1.0 +9.0
+3.0 -9.0 -6.0
A_TA :
+131.0 -24.0
-24.0 +126.0
Press return to continue.
------------------------------------
inv(A_TA) :
+0.0079 +0.0015
+0.0015 +0.0082
Pseudo Inverse = inv(A_TA)*A_T :
+5.9887e-02 -2.1469e-02 +6.2147e-02
+3.5217e-02 -7.5518e-02 -3.5782e-02
Ide = (inv(A_TA)*A_T) * A
+1.00 +0.00
+0.00 +1.00
Press return to continue
Press X to stop