void eigsrt(VecDoub_IO &d, MatDoub_IO *v=NULL) { Int k; Int n=d.size(); for (Int i=0;i= p) p=d[k=j]; if (k != i) { d[k]=d[i]; d[i]=p; if (v != NULL) for (Int j=0;j::epsilon()) { Int i,j,ip,iq; Doub tresh,theta,tau,t,sm,s,h,g,c; VecDoub b(n),z(n); for (ip=0;ip 4 && g <= EPS*abs(d[ip]) && g <= EPS*abs(d[iq])) a[ip][iq]=0.0; else if (abs(a[ip][iq]) > tresh) { h=d[iq]-d[ip]; if (g <= EPS*abs(h)) t=(a[ip][iq])/h; else { theta=0.5*h/(a[ip][iq]); t=1.0/(abs(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][iq]; z[ip] -= h; z[iq] += h; d[ip] -= h; d[iq] += h; a[ip][iq]=0.0; for (j=0;j0;i--) { l=i-1; h=scale=0.0; if (l > 0) { for (k=0;k= 0.0 ? -sqrt(h) : sqrt(h)); e[i]=scale*g; h -= f*g; z[i][l]=f-g; f=0.0; for (j=0;j::epsilon(); for (i=1;i=l;i--) { f=s*e[i]; b=c*e[i]; e[i+1]=(r=pythag(f,g)); if (r == 0.0) { d[i+1] -= p; e[m]=0.0; break; } s=f/r; c=g/r; g=d[i+1]-p; r=(d[i]-g)*s+2.0*c*b; d[i+1]=g+(p=s*r); g=c*r-b; if (yesvecs) { for (k=0;k= l) continue; d[l] -= p; e[l]=g; e[m]=0.0; } } while (m != l); } } Doub Symmeig::pythag(const Doub a, const Doub b) { Doub absa=abs(a), absb=abs(b); return (absa > absb ? absa*sqrt(1.0+SQR(absb/absa)) : (absb == 0.0 ? 0.0 : absb*sqrt(1.0+SQR(absa/absb)))); }