Mathc matrices/c12b14
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