68 fprintf(stderr,
"[svd] #rows must be >= #cols \n");
72 double c,
f, h, s, x, y, z;
73 double anorm = 0.0, g = 0.0, scale = 0.0;
74 double *rv1 = malloc(n *
sizeof(
double));
78 for (
int i = 0; i < n; i++)
86 for (
int k = i; k <
m; k++)
87 scale += fabs(a[k*str+i]);
90 for (
int k = i; k <
m; k++)
92 a[k*str+i] = a[k*str+i]/scale;
93 s += a[k*str+i] * a[k*str+i];
96 g = -
SIGN(sqrt(s),
f);
101 for (
int j = l; j < n; j++)
104 for (
int k = i; k <
m; k++)
105 s += a[k*str+i] * a[k*str+j];
107 for (
int k = i; k <
m; k++)
108 a[k*str+j] +=
f * a[k*str+i];
111 for (
int k = i; k <
m; k++)
112 a[k*str+i] = a[k*str+i]*scale;
119 if (i <
m && i != n - 1)
121 for (
int k = l; k < n; k++)
122 scale += fabs(a[i*str+k]);
125 for (
int k = l; k < n; k++)
127 a[i*str+k] = a[i*str+k]/scale;
128 s += a[i*str+k] * a[i*str+k];
131 g = -
SIGN(sqrt(s),
f);
134 for (
int k = l; k < n; k++)
135 rv1[k] = a[i*str+k] / h;
138 for (
int j = l; j <
m; j++)
141 for (
int k = l; k < n; k++)
142 s += a[j*str+k] * a[i*str+k];
143 for (
int k = l; k < n; k++)
144 a[j*str+k] += s * rv1[k];
147 for (
int k = l; k < n; k++)
148 a[i*str+k] = a[i*str+k]*scale;
151 anorm =
MAX(anorm, (fabs(w[i]) + fabs(rv1[i])));
155 for (
int i = n - 1; i >= 0; i--)
161 for (
int j = l; j < n; j++)
162 v[j*n+i] = a[i*str+j] / a[i*str+l] / g;
164 for (
int j = l; j < n; j++)
167 for (
int k = l; k < n; k++)
168 s += a[i*str+k] * v[k*n+j];
169 for (
int k = l; k < n; k++)
170 v[k*n+j] += s * v[k*n+i];
173 for (
int j = l; j < n; j++)
174 v[i*n+j] = v[j*n+i] = 0.0;
182 for (
int i = n - 1; i >= 0; i--)
187 for (
int j = l; j < n; j++)
194 for (
int j = l; j < n; j++)
197 for (
int k = l; k <
m; k++)
198 s += a[k*str+i] * a[k*str+j];
199 f = (s / a[i*str+i]) * g;
200 for (
int k = i; k <
m; k++)
201 a[k*str+j] +=
f * a[k*str+i];
204 for (
int j = i; j <
m; j++)
205 a[j*str+i] = a[j*str+i]*g;
209 for (
int j = i; j <
m; j++)
216 for (
int k = n - 1; k >= 0; k--)
218 const int max_its = 30;
219 for (
int its = 0; its <= max_its; its++)
223 for (l = k; l >= 0; l--)
226 if (fabs(rv1[l]) + anorm == anorm)
231 if (l == 0 || fabs(w[nm]) + anorm == anorm)
237 for (
int i = l; i <= k; i++)
240 if (fabs(
f) + anorm != anorm)
248 for (
int j = 0; j <
m; j++)
252 a[j*str+nm] = y * c + z * s;
253 a[j*str+i] = z * c - y * s;
264 for (
int j = 0; j < n; j++)
265 v[j*n+k] = -v[j*n+k];
269 if (its >= max_its) {
270 fprintf(stderr,
"[svd] no convergence after %d iterations\n", its);
281 f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y);
283 f = ((x - z) * (x + z) + h * ((y / (
f +
SIGN(g,
f))) - h)) / x;
287 for (
int j = l; j <= nm; j++)
302 for (
int jj = 0; jj < n; jj++)
306 v[jj*n+j] = x * c + z * s;
307 v[jj*n+i] = z * c - x * s;
317 f = (c * g) + (s * y);
318 x = (c * y) - (s * g);
319 for (
int jj = 0; jj <
m; jj++)
323 a[jj*str+j] = y * c + z * s;
324 a[jj*str+i] = z * c - y * s;
static float f(const float t, const float c, const float x)
Definition graduatednd.c:173
static int dsvd(double *a, int m, int n, int str, double *w, double *v)
Definition svd.h:58