Linear Algebra and the C Language/a0lk
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as : c03d.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define RB R3
#define CB C1
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
{
double b[RB*(CB)]={
+0.333333333333,
+0.666666666667,
+1.000000000000
};
double x[RB*C1]={
-1,
2,
-3
};
double **B = ca_A_mR(b,i_mR(RB,CB));
double **BT = i_mR(CB,RB);
double **BTB = i_mR(CB,CB);
double **invBTB = i_mR(CB,CB);
double **invBTB_BT = i_mR(CB,RB);
double **B_invBTB_BT = i_mR(RB,RB);
double **Id = eye_mR(i_mR(RB,RB));
double **V = i_mR(RB,RB); /* Id-(B inv(BT B) BT) */
double **X = ca_A_mR(x,i_mR(RB,C1));
double **VX = 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(transpose_mR(B,BT),S5,P4,C7);
printf(" BT B:");
p_mR(mul_mR(BT,B,BTB),S5,P4,C7);
printf(" inv(BTB):");
invBTB[R1][C1] = 1./BTB[R1][C1];
p_mR(invBTB,S5,P4,C7);
printf(" inv(BTB) BT :");
p_mR(mul_mR(invBTB,BT,invBTB_BT),S5,P4,C7);
printf(" B inv(BTB)BT:");
p_mR(mul_mR(B,invBTB_BT,B_invBTB_BT),S5,P4,C7);
printf(" V = Id-(B inv(BTB)BT)");
p_mR(sub_mR(Id,B_invBTB_BT,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(" X:");
p_mR(X,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(mul_mR(V,X,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 R3 :
Proj(x) = [Id-(B inv(BTB)BT)]
B: See the previous c file
+0.3333
+0.6667
+1.0000
Press return to continue.
BT:
+0.3333 +0.6667 +1.0000
BT B:
+1.5556
inv(BTB):
+0.6429
inv(BTB) BT :
+0.2143 +0.4286 +0.6429
B inv(BTB)BT:
+0.0714 +0.1429 +0.2143
+0.1429 +0.2857 +0.4286
+0.2143 +0.4286 +0.6429
V = Id-(B inv(BTB)BT)
+0.9286 -0.1429 -0.2143
-0.1429 +0.7143 -0.4286
-0.2143 -0.4286 +0.3571
Press return to continue.
V is transformation matrix for
a projection onto a R3 subspace
V:
+0.9286 -0.1429 -0.2143
-0.1429 +0.7143 -0.4286
-0.2143 -0.4286 +0.3571
X:
-1.0000
+2.0000
-3.0000
Proj(x) = [Id-(B inv(BTB)BT)] x
Proj(x) = V x Verify the result with the first C file
-0.5714
+2.8571
-1.7143
Press return to continue.