Linear Algebra and the C Language/a0lt
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as : c05d.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define RB R5
#define CB C3
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
{
double b[RB*(CB)]={
+0.000000000000, -2.000000000000, -0.500000000000,
+0.000000000000, -1.666666666667, +0.000000000000,
+1.000000000000, +0.000000000000, +0.000000000000,
+0.000000000000, +1.000000000000, +0.000000000000,
+0.000000000000, +0.000000000000, +1.000000000000
};
double x[RB*(C1)]={
-1,
2,
-3,
-3,
-1,
};
double **B = ca_A_mR(b, i_mR(RB,CB));
double **BT = transpose_mR(B, i_mR(CB,RB));
double **BTB = mul_mR(BT,B, i_mR(CB,CB));
double **invBTB = inv_mR(BTB, i_mR(CB,CB));
double **invBTB_BT = mul_mR(invBTB,BT, i_mR(CB,RB));
double **B_invBTB_BT = mul_mR(B,invBTB_BT, i_mR(RB,RB));
double **Id = eye_mR( i_mR(RB,RB));
double **V = sub_mR(Id,B_invBTB_BT, i_mR(RB,RB));
/* Id-(B inv(BT B) BT) */
double **X = ca_A_mR(x, i_mR(RB,C1));
double **VX = mul_mR(V,X, i_mR(RB,C1));
clrscrn();
printf(" B is a basis for the orthogonal complement of AT: \n\n"
" Find a transformation matrix for \n"
" a projection onto R%d: \n\n"
" Proj(x) = [Id-(B inv(BTB)BT)] \n\n"
" B: See the previous c file",RB);
p_mR(B,S5,P4,C7);
stop();
clrscrn();
printf(" BT:");
p_mR(BT,S5,P4,C7);
printf(" BT B:");
p_mR(BTB,S5,P4,C7);
printf(" inv(BTB):");
p_mR(invBTB,S5,P4,C7);
stop();
clrscrn();
printf(" inv(BTB) BT:");
p_mR(invBTB_BT,S5,P4,C7);
printf(" B inv(BTB)BT:");
p_mR(B_invBTB_BT,S5,P4,C7);
printf(" V = Id - (B inv(BT B) BT)");
p_mR(V,S5,P4,C7);
stop();
clrscrn();
printf(" V is transformation matrix for \n"
" a projection onto a R%d subspace \n\n"
" V:",RB);
p_mR(V,S5,P4,C7);
printf(" Proj(x) = [Id-(B inv(BTB)BT)] x \n\n"
" Proj(x) = V x Verify the result with the first C file");
p_mR(VX,S5,P4,C7);
stop();
f_mR(B);
f_mR(BT);
f_mR(BTB);
f_mR(invBTB);
f_mR(invBTB_BT);
f_mR(V); /* Id-(B inv(BT B) BT) */
f_mR(X);
f_mR(VX);
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Screen output example:
B is a basis for the orthogonal complement of AT:
Find a transformation matrix for
a projection onto R5:
Proj(x) = [Id-(B inv(BTB)BT)]
B: See the previous c file
+0.0000 -2.0000 -0.5000
+0.0000 -1.6667 +0.0000
+1.0000 +0.0000 +0.0000
+0.0000 +1.0000 +0.0000
+0.0000 +0.0000 +1.0000
Press return to continue.
BT:
+0.0000 +0.0000 +1.0000 +0.0000 +0.0000
-2.0000 -1.6667 +0.0000 +1.0000 +0.0000
-0.5000 +0.0000 +0.0000 +0.0000 +1.0000
BT B:
+1.0000 +0.0000 +0.0000
+0.0000 +7.7778 +1.0000
+0.0000 +1.0000 +1.2500
inv(BTB):
+1.0000 -0.0000 -0.0000
-0.0000 +0.1433 -0.1146
-0.0000 -0.1146 +0.8917
Press return to continue.
inv(BTB) BT:
+0.0000 +0.0000 +1.0000 +0.0000 +0.0000
-0.2293 -0.2389 +0.0000 +0.1433 -0.1146
-0.2166 +0.1911 +0.0000 -0.1146 +0.8917
B inv(BTB)BT:
+0.5669 +0.3822 +0.0000 -0.2293 -0.2166
+0.3822 +0.3981 +0.0000 -0.2389 +0.1911
+0.0000 +0.0000 +1.0000 +0.0000 +0.0000
-0.2293 -0.2389 +0.0000 +0.1433 -0.1146
-0.2166 +0.1911 +0.0000 -0.1146 +0.8917
V = Id - (B inv(BT B) BT)
+0.4331 -0.3822 +0.0000 +0.2293 +0.2166
-0.3822 +0.6019 +0.0000 +0.2389 -0.1911
+0.0000 +0.0000 +0.0000 +0.0000 +0.0000
+0.2293 +0.2389 +0.0000 +0.8567 +0.1146
+0.2166 -0.1911 +0.0000 +0.1146 +0.1083
Press return to continue.
V is transformation matrix for
a projection onto a R5 subspace
V:
+0.4331 -0.3822 +0.0000 +0.2293 +0.2166
-0.3822 +0.6019 +0.0000 +0.2389 -0.1911
+0.0000 +0.0000 +0.0000 +0.0000 +0.0000
+0.2293 +0.2389 +0.0000 +0.8567 +0.1146
+0.2166 -0.1911 +0.0000 +0.1146 +0.1083
Proj(x) = [Id-(B inv(BTB)BT)] x
Proj(x) = V x Verify the result with the first C file
-2.1019
+1.0605
+0.0000
-2.4363
-1.0510
Press return to continue.