#include #include #include #define ROTATE(a,i,j,k,l) g=a[i*n + j];h=a[k*n + l];a[i*n + j]=g-s*(h+g*tau);\ a[k*n + l]=h+s*(g-h*tau); /* Computes all eigenvalues and eigenvectors of a real symmetric matrix a[1..n][1..n]. On output, elements of a above the diagonal are destroyed. d[1..n] returns the eigenvalues of a. v[1..n][1..n] is a matrix whose columns contain, on output, the normalized eigenvectors of a. nrot returns the number of Jacobi rotations that were required. */ void jacobi(float *a, int n, float d[], float *v, int *nrot) { int j,iq,ip,i; float tresh,theta,tau,t,sm,s,h,g,c,*b,*z; b = (float *) malloc(n * sizeof(float)); z = (float *) malloc(n * sizeof(float)); for (ip=0;ip 4 && (float)(fabs(d[ip])+g) == (float)fabs(d[ip]) // After four sweeps, skip the rotation if the off-diagonal element is small. && (float)(fabs(d[iq])+g) == (float)fabs(d[iq])) a[ip*n + iq]=0.0; else if (fabs(a[ip*n + iq]) > tresh) { h=d[iq]-d[ip]; if ((float)(fabs(h)+g) == (float)fabs(h)) t=(a[ip*n + iq])/h; // t = 1/(2*theta) else { theta=0.5*h/(a[ip*n + iq]); // Equation (11.1.10). t=1.0/(fabs(theta)+sqrt(1.0+theta*theta)); if (theta < 0.0) t = -t; } c=1.0/sqrt(1+t*t); s=t*c; tau=s/(1.0+c); h=t*a[ip*n + iq]; z[ip] -= h; z[iq] += h; d[ip] -= h; d[iq] += h; a[ip*n + iq]=0.0; for (j=0;j<=ip-1;j++) { // Case of rotations 1 <= j < p. ROTATE(a,j,ip,j,iq) } for (j=ip+1;j<=iq-1;j++) { // Case of rotations p < j < q. ROTATE(a,ip,j,j,iq) } for (j=iq+1;j= p) p=d[k=j]; if (k != i) { d[k]=d[i]; d[i]=p; for (j=0;j