39int dsvd(
double **
a,
int m,
int n,
double *w,
double **v)
41 int flag, i, its, j, jj, k, l=0, nm=0;
42 double c, f,
h, s,
x,
y,
z;
43 double anorm = 0.0, g = 0.0, scale = 0.0;
47 fprintf(stderr,
"#rows must be > #cols \n");
51 std::vector<double> rv1 (n);
54 for (i = 0; i < n; i++)
62 for (k = i; k < m; k++)
63 scale += fabs((
double)
a[k][i]);
66 for (k = i; k < m; k++)
68 a[k][i] = (double)((
double)
a[k][i]/scale);
69 s += ((double)
a[k][i] * (double)
a[k][i]);
72 g = -
SIGN(sqrt(s), f);
74 a[i][i] = (double)(f - g);
77 for (j = l; j < n; j++)
79 for (s = 0.0, k = i; k < m; k++)
80 s += ((
double)
a[k][i] * (
double)
a[k][j]);
82 for (k = i; k < m; k++)
83 a[k][j] += (
double)(f * (double)
a[k][i]);
86 for (k = i; k < m; k++)
87 a[k][i] = (
double)((double)
a[k][i]*scale);
90 w[i] = (double)(scale * g);
94 if (i < m && i != n - 1)
96 for (k = l; k < n; k++)
97 scale += fabs((
double)
a[i][k]);
100 for (k = l; k < n; k++)
102 a[i][k] = (double)((
double)
a[i][k]/scale);
103 s += ((double)
a[i][k] * (double)
a[i][k]);
106 g = -
SIGN(sqrt(s), f);
108 a[i][l] = (double)(f - g);
109 for (k = l; k < n; k++)
110 rv1[k] = (
double)
a[i][k] /
h;
113 for (j = l; j < m; j++)
115 for (s = 0.0, k = l; k < n; k++)
116 s += ((
double)
a[j][k] * (
double)
a[i][k]);
117 for (k = l; k < n; k++)
118 a[j][k] += (
double)(s * rv1[k]);
121 for (k = l; k < n; k++)
122 a[i][k] = (
double)((double)
a[i][k]*scale);
125 anorm =
MAX(anorm, (fabs((
double)w[i]) + fabs(rv1[i])));
129 for (i = n - 1; i >= 0; i--)
135 for (j = l; j < n; j++)
136 v[j][i] = (
double)(((double)
a[i][j] / (double)
a[i][l]) / g);
138 for (j = l; j < n; j++)
140 for (s = 0.0, k = l; k < n; k++)
141 s += ((
double)
a[i][k] * (
double)v[k][j]);
142 for (k = l; k < n; k++)
143 v[k][j] += (
double)(s * (double)v[k][i]);
146 for (j = l; j < n; j++)
147 v[i][j] = v[j][i] = 0.0;
155 for (i = n - 1; i >= 0; i--)
160 for (j = l; j < n; j++)
167 for (j = l; j < n; j++)
169 for (s = 0.0, k = l; k < m; k++)
170 s += ((
double)
a[k][i] * (
double)
a[k][j]);
171 f = (s / (double)
a[i][i]) * g;
172 for (k = i; k < m; k++)
173 a[k][j] += (
double)(f * (double)
a[k][i]);
176 for (j = i; j < m; j++)
177 a[j][i] = (
double)((double)
a[j][i]*g);
181 for (j = i; j < m; j++)
188 for (k = n - 1; k >= 0; k--)
190 for (its = 0; its < 30; its++)
193 for (l = k; l >= 0; l--)
196 if (fabs(rv1[l]) + anorm == anorm)
201 if (fabs((
double)w[nm]) + anorm == anorm)
208 for (i = l; i <= k; i++)
211 if (fabs(f) + anorm != anorm)
219 for (j = 0; j < m; j++)
221 y = (double)
a[j][nm];
223 a[j][nm] = (double)(
y * c +
z * s);
224 a[j][i] = (double)(
z * c -
y * s);
235 for (j = 0; j < n; j++)
236 v[j][k] = (-v[j][k]);
241 fprintf(stderr,
"No convergence after 30,000! iterations \n");
251 f = ((
y -
z) * (
y +
z) + (g -
h) * (g +
h)) / (2.0 *
h *
y);
253 f = ((
x -
z) * (
x +
z) +
h * ((
y / (f +
SIGN(g, f))) -
h)) /
x;
257 for (j = l; j <= nm; j++)
272 for (jj = 0; jj < n; jj++)
274 x = (double)v[jj][j];
275 z = (double)v[jj][i];
276 v[jj][j] = (double)(
x * c +
z * s);
277 v[jj][i] = (double)(
z * c -
x * s);
287 f = (c * g) + (s *
y);
288 x = (c *
y) - (s * g);
289 for (jj = 0; jj < m; jj++)
291 y = (double)
a[jj][j];
292 z = (double)
a[jj][i];
293 a[jj][j] = (double)(
y * c +
z * s);
294 a[jj][i] = (double)(
z * c -
y * s);