51static inline double SIGN(
double a,
double b)
53 return copysign(
a,
b);
59 const double at = fabs(
a), bt = fabs(
b);
62 const double ct = bt / at;
63 return at * sqrt(1.0 + ct * ct);
67 const double ct = at / bt;
68 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++)
193 v[k*
n+j] += s *
v[k*
n+
i];
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++)
288 v[j*
n+k] = -
v[j*
n+k];
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;
#define m
Definition basecurve.c:277
const float i
Definition colorspaces_inline_conversions.h:669
const float h
Definition colorspaces_inline_conversions.h:1366
const float c
Definition colorspaces_inline_conversions.h:1365
const float g
Definition colorspaces_inline_conversions.h:925
const dt_aligned_pixel_t f
Definition colorspaces_inline_conversions.h:256
const float b
Definition colorspaces_inline_conversions.h:1326
const float a
Definition colorspaces_inline_conversions.h:1292
const float n
Definition colorspaces_inline_conversions.h:929
const char flag
Definition common/image.h:218
#define dt_free(ptr)
Definition darktable.h:380
static const float x
Definition iop_profile.h:239
static const float v
Definition iop_profile.h:223
static double PYTHAG(double a, double b)
Definition svd.h:57
static double SIGN(double a, double b)
Definition svd.h:51
static int dsvd(double *a, int m, int n, int str, double *w, double *v)
Definition svd.h:81
#define MAX(a, b)
Definition thinplate.c:29