home *** CD-ROM | disk | FTP | other *** search
- mateig(lra,n,a,s)
-
- /*to calculate eigen values and corresponding eigen*/
- /*vectors of a real symmetric matrix by the Jacobi*/
- /*method.*/
-
- int lra,n;
- float a[],s[];
-
- {
- double fabs(),sqrt();
- int i,ia,ii,iia,iib,ij,ik,il,in,ip,iq,is,j,ja,ka,la,m;
- float anorm,app,aqq,b,c,constf,csn,csn2,e,fnorm,snn,snn2,stc,u,v,w;
-
- e = 0.000001;
- constf = n;
- in = 0;
- for(j = 0; j <= n-1; j++)
- for(i = 0; i <= n-1; i++)
- {
- is = j * lra +i; /* move columnwise to new element */
- if ((i-j) == 0) s[is] = 1.; /* look for diagonal */
- else s[is] = 0.0; /* set non-diagonal to Z */
- } /* end of i loop */
- /* end of j loop */
- anorm = 0.0;
- for(j = 0; j <= n-1; j++)
- for(i = 0; i <= n-1; i++)
- {
- ia = i * lra +j; /* column */
- if ((j-i) != 0)
- anorm = anorm + a[ia] * a[ia];
- } /* end of i loop */
- /* end of j loop */
-
- anorm = sqrt(anorm);
- fnorm = anorm * e;
- l90:;
- anorm = anorm/constf;
- l80:;
- for(iq = 1; iq <= n-1; iq++)
- {
- m = iq - 1;
- for(ip = 0; ip <= m; ip++)
- {
-
- ia = lra * iq + ip; /* row iq , col ip */
- ja = lra * ip + iq; /* row ip , col iq */
- ka = lra * ip + ip; /* row ip , col ip */
- la = lra * iq + iq; /* row iq , col iq */
- if ((fabs(a[ja]) - anorm) < 0.0) goto l21;
- in = 1;
- u = -a[ja];
- v = (a[ka] - a[la]) / 2.0;
- w = u/(sqrt(u*u + v*v));
- if (v < 0.0) w = -w;
- snn = w/(sqrt(2.0 * (1.0 + sqrt(1.0 - w*w))));
- snn2 = snn * snn;
- csn = sqrt(1.0 - snn2);
-
- for(i = 0; i <= n-1; i++)
- {
- iia = lra * i + ip; /* row i, col ip */
- iib = lra * i + iq; /* row i, col iq */
- if ((i - ip) == 0) goto l301;
- if ((i - iq) == 0) goto l301;
- b = a[iia] * csn - a[iib] * snn;
- a[iib] = a[iia] * snn + a[iib] * csn;
- a[iia] = b;
- l301:
- c = s[iia] * csn - s[iib] * snn;
- s[iib] = s[iia] * snn + s[iib] * csn;
- s[iia] = c;
-
- } /* end of i loop */
- csn2 = csn * csn;
- stc = snn * csn;
- app = a[ka]*csn2 + a[la]*snn2 - 2.0*a[ja]*stc;
- aqq = a[ka]*snn2 + a[la] * csn2 + 2.0* a[ja] *stc;
- a[ja] = (a[ka] - a[la])*stc + a[ja]*(csn2-snn2);
- a[ia] = a[ja];
- a[ka] = app;
- a[la] = aqq;
-
- for(i = 0; i <= n-1; i++)
- {
- ii = lra * ip + i; /* row ip, col i */
- ij = lra * i + ip; /* row i, col ip */
- ik = lra * iq + i; /* row iq, col i */
- il = lra * i + iq; /* row i, col iq */
- a[ii] = a[ij];
- a[ik] = a[il];
- } /* end of i loop */
- l21: ;
- } /* end of ip loop */
- } /* end of iq loop */
- if ((in-1) != 0) goto l600;
- in = 0;
- goto l80;
- l600: if((anorm-fnorm) > 0.0) goto l90;
- }