Linear Algebra and the C Language/a04u
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as: c00b.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
#define RA R5
#define CA C3
/* ------------------------------------ */
int main(void)
{
double tA[RA*CA]={
-8, +6, -3,
+4, -9, +5,
-7, -5, -5,
+9, +9, -1,
+3, -8, +3
};
double **A = ca_A_mR(tA, i_mR(RA,CA));
double **A_T = transpose_mR(A, i_mR(CA,RA));
double **A_TA = mul_mR(A_T,A, i_mR(CA,CA));
double **invA_TA = inv_mR(A_TA, i_mR(CA,CA));
double **invA_TAA_T = mul_mR(invA_TA,A_T, i_mR(CA,RA));
double **Ide = mul_mR(invA_TAA_T,A, i_mR(CA,CA));
clrscrn();
printf(" A:");
p_mR(A, S7,P2,C5);
printf(" A_T:");
p_mR(A_T, S7,P2,C5);
printf(" A_TA:");
p_mR(A_TA, S7,P2,C5);
stop();
clrscrn();
printf(" inv(A_TA):");
pE_mR(invA_TA, S12,P4,C5);
printf(" Pseudo Inverse = inv(A_TA) A_T");
pE_mR(invA_TAA_T, S12,P4,C5);
printf(" Ide = (inv(A_TA) A_T) A");
p_mR(Ide, S8,P2,C5);
stop();
f_mR(A);
f_mR(A_T);
f_mR(A_TA);
f_mR(invA_TA);
f_mR(invA_TAA_T);
f_mR(Ide);
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Screen output example:
A:
-8.00 +6.00 -3.00
+4.00 -9.00 +5.00
-7.00 -5.00 -5.00
+9.00 +9.00 -1.00
+3.00 -8.00 +3.00
A_T:
-8.00 +4.00 -7.00 +9.00 +3.00
+6.00 -9.00 -5.00 +9.00 -8.00
-3.00 +5.00 -5.00 -1.00 +3.00
A_TA:
+219.00 +8.00 +79.00
+8.00 +287.00 -71.00
+79.00 -71.00 +69.00
Press return to continue.
inv(A_TA):
+1.0955e-02 -4.5720e-03 -1.7247e-02
-4.5720e-03 +6.5823e-03 +1.2008e-02
-1.7247e-02 +1.2008e-02 +4.6595e-02
Pseudo Inverse = inv(A_TA) A_T
-6.3329e-02 -1.2675e-03 +3.2411e-02 +7.4691e-02 +1.7700e-02
+4.0047e-02 -1.7490e-02 -6.0946e-02 +6.0851e-03 -3.0351e-02
+7.0236e-02 +5.5918e-02 -1.7229e-01 -9.3747e-02 -8.0175e-03
Ide = (inv(A_TA) A_T) A
+1.00 +0.00 -0.00
-0.00 +1.00 -0.00
-0.00 -0.00 +1.00
Press return to continue.