36inline int svdcmp(
double u[],
double w[],
double v[],
37 const double a[],
int m,
int n)
47 static double srv1[
NSTAT];
48 int flag, i, its, j, jj, k, l=0, nm=0;
49 double anorm, c, f, g, h, s, scale, x, y, z, *rv1;
51 if (n<=
NSTAT) rv1=srv1;
else rv1=(
double *)malloc(n*
sizeof(
double));
52 if (!rv1)
return(errno);
54 if (u!=a) memcpy(u, a, m*n*
sizeof(
double));
58 l=i+1; rv1[i]=scale*g; g=s=scale=0;
60 double *uki=u+i*(n+1);
62 for (k=i; k<m; k++, uki+=n) scale+=fabs(*uki);
64 for (uki=u+i*(n+1), k=i; k<m; k++, uki+=n) {
65 *uki/=scale; s+=(*uki)*(*uki);
67 f=u[i*n+i]; g=-
SIGN(sqrt(s),f); h=f*g-s; u[i*n+i]=f-g;
71 for (s=0, uki=u+i*(n+1), ukj=u+i*n+j, k=i; k<m; k++, uki+=n, ukj+=n)
74 for (uki=u+i*(n+1), ukj=u+i*n+j, k=i; k<m; k++, uki+=n, ukj+=n)
77 for (uki=u+i*(n+1), k=i; k<m; k++, uki+=n) (*uki)*=scale;
80 w[i]=scale*g; g=s=scale=0;
84 for (k=l; k<n; k++) scale+=fabs(ui[k]);
86 for (ui=u+i*n+l, k=l; k<n; k++, ui++) { (*ui)/=scale; s+=(*ui)*(*ui); }
87 f=u[i*n+l]; g=-
SIGN(sqrt(s),f); h=f*g-s; u[i*n+l]=f-g;
88 for (ui=u+i*n, k=l; k<n; k++) rv1[k]=ui[k]/h;
92 for (s=0, k=l; k<n; k++) s+=uj[k]*ui[k];
93 for (uj=u+j*n, k=l; k<n; k++) uj[k]+=s*rv1[k];
95 for (ui=u+i*n, k=l; k<n; k++) ui[k]*=scale;
98 {
double tmp=fabs(w[i])+fabs(rv1[i]);
if (tmp>anorm) anorm=tmp; }
101 for (i=n-1; i>=0; i--) {
104 double *vji=v+l*n+i, *ui=u+i*n, g1=ui[l]*g;
107 g1=1/g1;
for (j=l; j<n; j++, vji+=n) *vji=g1*ui[j];
109 g1=1/ui[l];
for (j=l; j<n; j++, vji+=n) *vji=(ui[j]*g1)/g;
111 for (j=l; j<n; j++) {
112 double *vkj=v+l*n+j, *vki=v+l*n+i;
114 for (s=0, ui=u+i*n, k=l; k<n; k++, vkj+=n) s+=ui[k]*(*vkj);
115 for (vkj=v+l*n+j, k=l; k<n; k++, vkj+=n, vki+=n) (*vkj)+=s*(*vki);
119 double *vi=v+i*n, *vji=v+l*n+i;
121 for (j=l; j<n; j++, vji+=n) vi[j]=(*vji)=0;
124 v[i*n+i]=1; g=rv1[i]; l=i;
127 for (i=(m>n ? n : m)-1; i>=0; i--) {
129 {
double *ui=u+i*n;
for (j=l; j<n; j++) ui[j]=0; }
132 for (j=l; j<n; j++) {
133 double *uki=u+l*n+i, *ukj=u+l*n+j;
135 for (s=0, k=l; k<m; k++, uki+=n, ukj+=n) s+=(*uki)*(*ukj);
137 for (uki=u+i*n+i, ukj=u+i*n+j, k=i; k<m; k++, uki+=n, ukj+=n)
140 {
double *uji=u+i*n+i;
for (j=i; j<m; j++, uji+=n) (*uji)*=g; }
144 for (j=i; j<m; j++, uji+=n) *uji=0;
149 for (k=n-1; k>=0; k--) {
150 for (its=0; its<=
MAXIT; its++) {
152 for (l=k; l>=0; l--) {
153 nm=l-1;
if (fabs(rv1[l])+anorm==anorm) { flag=0;
break; }
154 if (fabs(w[nm])+anorm==anorm)
break;
158 for (i=l; i<=k; i++) {
159 f=s*rv1[i]; rv1[i]=c*rv1[i];
160 if (fabs(f)+anorm==anorm)
break;
161 g=w[i]; h=hypot(f, g); w[i]=h; h=1/h; c=g*h; s=-f*h;
163 double *ujnm=u+nm, *uji=u+i;
165 for (j=0; j<m; j++, ujnm+=n, uji+=n) {
166 y=(*ujnm); z=(*uji); (*ujnm)=y*c+z*s; (*uji)=z*c-y*s;
176 w[k]= -z;
for (j=0; j<n; j++, vjk+=n) (*vjk)= -(*vjk);
181 if (its==
MAXIT) {
if (n>
NSTAT) free(rv1);
return(ERANGE); }
183 x=w[l]; nm=k-1; y=w[nm]; g=rv1[nm]; h=rv1[k];
184 f=((y-z)*(y+z)+(g-h)*(g+h))/(2*h*y);
185 g=hypot(f, 1); f=((x-z)*(x+z)+h*((y/(f+
SIGN(g,f)))-h))/x; c=s=1;
186 for (j=l; j<=nm; j++) {
187 i=j+1; g=rv1[i]; y=w[i]; h=s*g; g=c*g; z=hypot(f,h);
189 {
double z1=1/z; c=f*z1; s=h*z1; }
190 f=x*c+g*s; g=g*c-x*s; h=y*s; y*=c;
192 double *vjjj=v+j, *vjji=v+i;
194 for (jj=0; jj<n; jj++, vjjj+=n, vjji+=n) {
195 x=(*vjjj); z=(*vjji); (*vjjj)=x*c+z*s; (*vjji)=z*c-x*s;
198 z=hypot(f,h); w[j]=z;
199 if (z) { z=1/z; c=f*z; s=h*z; }
200 f=c*g+s*y; x=c*y-s*g;
202 double *ujjj=u+j, *ujji=u+i;
204 for (jj=0; jj<m; jj++, ujjj+=n, ujji+=n) {
205 y=(*ujjj); z=(*ujji); (*ujjj)=y*c+z*s; (*ujji)=z*c-y*s;
209 rv1[l]=0; rv1[k]=f; w[k]=x;
213 if (n>
NSTAT) free(rv1);