Linear Algebra and the C Language/a03u
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as: c02e.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
#define RA R3
#define CA C5
/* ------------------------------------ */
#define FACTOR_E +1.E-0
/* ------------------------------------ */
void fun(void)
{
double **A = r_mR( i_mR(RA,CA),9);
double **Pinv = Pinv_Cn_mR(A, i_mR(CA,RA),FACTOR_E);
double **PinvA = mul_mR(Pinv,A, i_mR(CA,CA));
double **PinvAPinv = mul_mR(PinvA,Pinv, i_mR(CA,RA));
clrscrn();
printf(" A:");
p_mR(A, S7,P2,C7);
printf(" PseudoInverse = V invS_T U_T ");
pE_mR(Pinv, S12,P4,C10);
stop();
clrscrn();
printf(" Pinv*A:");
p_mR(PinvA, S7,P2,C10);
printf(" Pinv*A*Pinv:");
p_mR(PinvAPinv, S7,P4,C10);
printf(" Pinv:");
p_mR(Pinv, S7,P4,C7);
f_mR(A);
f_mR(Pinv);
f_mR(PinvA);
f_mR(PinvAPinv);
}
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
do
{
fun();
} while(stop_w());
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Screen output example:
A :
-5.00 +7.00 -6.00 +8.00 -5.00
-1.00 +5.00 -4.00 +7.00 +6.00
-4.00 -8.00 -8.00 -4.00 +6.00
PseudoInverse = V * invS_T * U_T
-4.4324e-02 +2.4551e-02 -3.2216e-02
+1.0385e-02 +3.3234e-02 -3.8845e-02
-4.3724e-02 +1.1272e-03 -5.1993e-02
+1.5714e-02 +4.4527e-02 -1.7308e-02
-6.3525e-02 +9.1867e-02 +1.2532e-02
Press return to continue.
Pinv*A:
+0.33 +0.07 +0.43 -0.05 +0.18
+0.07 +0.55 +0.12 +0.47 -0.09
+0.43 +0.12 +0.67 -0.13 -0.09
-0.05 +0.47 -0.13 +0.51 +0.08
+0.18 -0.09 -0.09 +0.08 +0.94
Pinv*A*Pinv:
-0.0443 +0.0246 -0.0322
+0.0104 +0.0332 -0.0388
-0.0437 +0.0011 -0.0520
+0.0157 +0.0445 -0.0173
-0.0635 +0.0919 +0.0125
Pinv :
-0.0443 +0.0246 -0.0322
+0.0104 +0.0332 -0.0388
-0.0437 +0.0011 -0.0520
+0.0157 +0.0445 -0.0173
-0.0635 +0.0919 +0.0125
Press return to continue
Press X return to stop