Linear Algebra and the C Language/a0id
Install and compile this file in your working directory.
/* ------------------------------------ */
/* Save as : c00e.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
void fun(int r)
{
double **A = rdefinite_positive_mR( i_mR(r,r), 99);
double **SqrtA = i_mR(r,r);
double **invSqrtA = i_mR(r,r);
double **V = i_mR(r,r);
double **VT = i_mR(r,r);
double **EValue = i_mR(r,r);
double **f_EValue = i_mR(r,r);
double **T1 = i_mR(r,r);
clrscrn();
printf(" A:");
p_mR(A, S10,P4, C8);
/* Eigenvector */
eigs_V_mR(A,V);
transpose_mR(V,VT);
/* EigenValue = VT * A * V */
mul_mR(VT,A,T1);
mul_mR(T1,V,EValue);
printf(" sqrt(A) = V * sqrt(EValue) * VT\n");
f_eigs_mR(sqrt,EValue,f_EValue);
mul_mR(V,f_EValue,T1);
mul_mR(T1,VT, SqrtA);
p_mR(SqrtA, S10,P4, C8);
printf(" inv(sqrt(A)):");
inv_mR(SqrtA,invSqrtA);
p_mR(invSqrtA, S10,P4, C8);
printf(" IDE = sqrt(A) inv(sqrt(A))");
mul_mR(SqrtA,invSqrtA,T1);
p_mR(T1, S10,P4, C8);
f_mR(A);
f_mR(SqrtA);
f_mR(invSqrtA);
f_mR(V);
f_mR(VT);
f_mR(EValue);
f_mR(f_EValue);
f_mR(T1);
}
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
do
{
fun(RC3);
} while(stop_w());
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
A positive-matrix is positive definite if and only if its positive square root is invertible.
Screen output example:
A:
+82.6521 -3.8208 +5.0643
-3.8208 +45.6841 +21.6262
+5.0643 +21.6262 +68.6638
sqrt(A) = V * sqrt(EValue) * VT
+9.0817 -0.2736 +0.3173
-0.2736 +6.5908 +1.4732
+0.3173 +1.4732 +8.1482
inv(sqrt(A)):
+0.1105 +0.0058 -0.0053
+0.0058 +0.1584 -0.0289
-0.0053 -0.0289 +0.1282
IDE = sqrt(A) inv(sqrt(A))
+1.0000 -0.0000 -0.0000
-0.0000 +1.0000 -0.0000
+0.0000 +0.0000 +1.0000
Press return to continue
Press X return to stop