// *Finding Eigenvalues Of Symmetric Matrix-Jakobi's Method* by Krzysztof Bosak, 1999-01-20 #define MAIN #include "../joint/l3_mat.cpp" #include #define A a.ValueRaw #define E e.ValueRaw void EigenValuesJakobi(const nxnmatrix& a, double precision) {//Diagonalize double t; do { int j, k; double max=0; for(int jmax=0; jmax max) { j=jmax; k=kmax; max=fabs(A(jmax,kmax)); } double theta=(A(j,j)-A(k,k))/(2.0*A(j,k)); if(theta>=0) t=1.0/(theta+sqrt(1.0+theta*theta)); else t=-1.0/(-theta+sqrt(1.0+theta*theta)); double c=1.0/sqrt(1.0+t*t); double s=t*c; double tau=s/(1.0+c); int r=0; while(rprecision); } nxnmatrix EigenVectorsJakobi(const nxnmatrix& a, double precision) {//Diagonalize + find EigenVectors //nxnmatrix copy(a);//this line for later checking only nxnmatrix e(a.Size()); for(int i=0; i max) { j=jmax; k=kmax; max=fabs(A(jmax,kmax)); } double theta=(A(j,j)-A(k,k))/(2.0*A(j,k)); if(theta>=0) t=1.0/(theta+sqrt(1.0+theta*theta)); else t=-1.0/(-theta+sqrt(1.0+theta*theta)); double c=1.0/sqrt(1.0+t*t); double s=t*c; double tau=s/(1.0+c); int r=0; while(rprecision); /* //Nullify very small elements to avoid messy output: for(int x=0; x