Linear Algebra and the C Language/a0is
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as : c00b.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define RA R3
#define CA C5
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
{
double a[RA*CA]={ +6,-4,+2,-8,+7,
+9,-6,+9,-3,-9,
-8,+2,+3,-4,-4 };
double **A = ca_A_mR(a, i_mR(RA,CA)); /* RA,CA */
double **A_T = transpose_mR(A, i_mR(CA,RA)); /* CA,RA */
double **AA_T = mul_mR(A,A_T, i_mR(RA,RA)); /* RA,CA CA,RA */
double **invAA_T = inv_mR(AA_T, i_mR(RA,RA)); /* RA,RA */
double **A_TinvAA_T = mul_mR(A_T,invAA_T, i_mR(CA,RA)); /* CA,RA RA,RA */
double **Ide = mul_mR(A,A_TinvAA_T, i_mR(RA,RA)); /* RA,CA CA,RA */
clrscrn();
printf(" A :");
p_mR(A, S7,P2,C5);
printf(" A_T :");
p_mR(A_T, S7,P1,C5);
printf(" AA_T:");
p_mR(AA_T, S7,P1,C5);
stop();
clrscrn();
printf(" inv(AA_T) :");
pE_mR(invAA_T, S12,P4,C5);
printf(" Pseudo Inverse = A_T inv(AA_T):");
pE_mR(A_TinvAA_T, S12,P4,C5);
printf(" Ide = A (A_T inv(AA_T))");
p_mR(Ide, S7,P2,C5);
stop();
f_mR(A);
f_mR(A_T);
f_mR(AA_T);
f_mR(invAA_T);
f_mR(A_TinvAA_T);
f_mR(Ide);
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Screen output example:
A :
+6.00 -4.00 +2.00 -8.00 +7.00
+9.00 -6.00 +9.00 -3.00 -9.00
-8.00 +2.00 +3.00 -4.00 -4.00
A_T :
+6.0 +9.0 -8.0
-4.0 -6.0 +2.0
+2.0 +9.0 +3.0
-8.0 -3.0 -4.0
+7.0 -9.0 -4.0
AA_T:
+169.0 +57.0 -46.0
+57.0 +288.0 -9.0
-46.0 -9.0 +109.0
Press return to continue.
inv(AA_T) :
+7.1565e-03 -1.3254e-03 +2.9107e-03
-1.3254e-03 +3.7267e-03 -2.5165e-04
+2.9107e-03 -2.5165e-04 +1.0382e-02
Pseudo Inverse = A_T inv(AA_T):
+7.7242e-03 +2.7601e-02 -6.7856e-02
-1.4852e-02 -1.7562e-02 +1.0631e-02
+1.1116e-02 +3.0134e-02 +3.4702e-02
-6.4918e-02 +4.2992e-04 -6.4058e-02
+5.0381e-02 -4.1812e-02 -1.8888e-02
Ide = A (A_T inv(AA_T))
+1.00 +0.00 +0.00
+0.00 +1.00 +0.00
+0.00 +0.00 +1.00
Press return to continue.