42static inline double SIGN(
double a,
double b)
44 return copysign(a, b);
48static inline double PYTHAG(
double a,
double b)
50 const double at = fabs(a), bt = fabs(b);
53 const double ct = bt / at;
54 return at * sqrt(1.0 + ct * ct);
58 const double ct = at / bt;
59 return bt * sqrt(1.0 + ct * ct);
91 fprintf(stderr,
"[svd] #rows must be >= #cols \n");
95 double c,
f, h, s,
x, y, z;
96 double anorm = 0.0,
g = 0.0, scale = 0.0;
97 double *rv1 = malloc(
n *
sizeof(
double));
101 for (
int i = 0;
i <
n;
i++)
109 for (
int k =
i;
k <
m;
k++)
110 scale += fabs(a[
k*str+
i]);
113 for (
int k =
i;
k <
m;
k++)
115 a[
k*str+
i] = a[
k*str+
i]/scale;
116 s += a[
k*str+
i] * a[
k*str+
i];
124 for (
int j = l; j <
n; j++)
127 for (
int k =
i;
k <
m;
k++)
128 s += a[
k*str+
i] * a[
k*str+j];
130 for (
int k =
i;
k <
m;
k++)
131 a[
k*str+j] +=
f * a[
k*str+
i];
134 for (
int k =
i;
k <
m;
k++)
135 a[
k*str+
i] = a[
k*str+
i]*scale;
142 if (
i <
m &&
i !=
n - 1)
144 for (
int k = l;
k <
n;
k++)
145 scale += fabs(a[
i*str+
k]);
148 for (
int k = l;
k <
n;
k++)
150 a[
i*str+
k] = a[
i*str+
k]/scale;
151 s += a[
i*str+
k] * a[
i*str+
k];
157 for (
int k = l;
k <
n;
k++)
158 rv1[
k] = a[
i*str+
k] / h;
161 for (
int j = l; j <
m; j++)
164 for (
int k = l;
k <
n;
k++)
165 s += a[j*str+
k] * a[
i*str+
k];
166 for (
int k = l;
k <
n;
k++)
167 a[j*str+
k] += s * rv1[
k];
170 for (
int k = l;
k <
n;
k++)
171 a[
i*str+
k] = a[
i*str+
k]*scale;
174 anorm =
MAX(anorm, (fabs(w[
i]) + fabs(rv1[
i])));
178 for (
int i =
n - 1;
i >= 0;
i--)
184 for (
int j = l; j <
n; j++)
185 v[j*
n+
i] = a[
i*str+j] / a[
i*str+l] /
g;
187 for (
int j = l; j <
n; j++)
190 for (
int k = l;
k <
n;
k++)
191 s += a[
i*str+
k] *
v[
k*
n+j];
192 for (
int k = l;
k <
n;
k++)
196 for (
int j = l; j <
n; j++)
197 v[
i*
n+j] =
v[j*
n+
i] = 0.0;
205 for (
int i =
n - 1;
i >= 0;
i--)
210 for (
int j = l; j <
n; j++)
217 for (
int j = l; j <
n; j++)
220 for (
int k = l;
k <
m;
k++)
221 s += a[
k*str+
i] * a[
k*str+j];
222 f = (s / a[
i*str+
i]) *
g;
223 for (
int k =
i;
k <
m;
k++)
224 a[
k*str+j] +=
f * a[
k*str+
i];
227 for (
int j =
i; j <
m; j++)
228 a[j*str+
i] = a[j*str+
i]*
g;
232 for (
int j =
i; j <
m; j++)
239 for (
int k =
n - 1;
k >= 0;
k--)
241 const int max_its = 30;
242 for (
int its = 0; its <= max_its; its++)
246 for (l =
k; l >= 0; l--)
249 if (fabs(rv1[l]) + anorm == anorm)
254 if (l == 0 || fabs(w[nm]) + anorm == anorm)
260 for (
int i = l;
i <=
k;
i++)
263 if (fabs(
f) + anorm != anorm)
271 for (
int j = 0; j <
m; j++)
275 a[j*str+nm] = y * c + z * s;
276 a[j*str+
i] = z * c - y * s;
287 for (
int j = 0; j <
n; j++)
292 if (its >= max_its) {
293 fprintf(stderr,
"[svd] no convergence after %d iterations\n", its);
304 f = ((y - z) * (y + z) + (
g - h) * (
g + h)) / (2.0 * h * y);
306 f = ((
x - z) * (
x + z) + h * ((y / (
f +
SIGN(
g,
f))) - h)) /
x;
310 for (
int j = l; j <= nm; j++)
325 for (
int jj = 0; jj <
n; jj++)
329 v[jj*
n+j] =
x * c + z * s;
330 v[jj*
n+
i] = z * c -
x * s;
340 f = (c *
g) + (s * y);
341 x = (c * y) - (s *
g);
342 for (
int jj = 0; jj <
m; jj++)
346 a[jj*str+j] = y * c + z * s;
347 a[jj*str+
i] = z * c - y * s;
float *const restrict const size_t k
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
static double PYTHAG(double a, double b)
static double SIGN(double a, double b)
static int dsvd(double *a, int m, int n, int str, double *w, double *v)
Compute the singular value decomposition of a dense matrix.