41static inline double SIGN(
double a,
double b)
43 return copysign(a, b);
47static inline double PYTHAG(
double a,
double b)
49 const double at = fabs(a), bt = fabs(b);
52 const double ct = bt / at;
53 return at * sqrt(1.0 + ct * ct);
57 const double ct = at / bt;
58 return bt * sqrt(1.0 + ct * ct);
90 fprintf(stderr,
"[svd] #rows must be >= #cols \n");
94 double c,
f, h, s,
x, y, z;
95 double anorm = 0.0,
g = 0.0, scale = 0.0;
96 double *rv1 = malloc(
n *
sizeof(
double));
100 for (
int i = 0;
i <
n;
i++)
108 for (
int k =
i;
k <
m;
k++)
109 scale += fabs(a[
k*str+
i]);
112 for (
int k =
i;
k <
m;
k++)
114 a[
k*str+
i] = a[
k*str+
i]/scale;
115 s += a[
k*str+
i] * a[
k*str+
i];
123 for (
int j = l; j <
n; j++)
126 for (
int k =
i;
k <
m;
k++)
127 s += a[
k*str+
i] * a[
k*str+j];
129 for (
int k =
i;
k <
m;
k++)
130 a[
k*str+j] +=
f * a[
k*str+
i];
133 for (
int k =
i;
k <
m;
k++)
134 a[
k*str+
i] = a[
k*str+
i]*scale;
141 if (
i <
m &&
i !=
n - 1)
143 for (
int k = l;
k <
n;
k++)
144 scale += fabs(a[
i*str+
k]);
147 for (
int k = l;
k <
n;
k++)
149 a[
i*str+
k] = a[
i*str+
k]/scale;
150 s += a[
i*str+
k] * a[
i*str+
k];
156 for (
int k = l;
k <
n;
k++)
157 rv1[
k] = a[
i*str+
k] / h;
160 for (
int j = l; j <
m; j++)
163 for (
int k = l;
k <
n;
k++)
164 s += a[j*str+
k] * a[
i*str+
k];
165 for (
int k = l;
k <
n;
k++)
166 a[j*str+
k] += s * rv1[
k];
169 for (
int k = l;
k <
n;
k++)
170 a[
i*str+
k] = a[
i*str+
k]*scale;
173 anorm =
MAX(anorm, (fabs(w[
i]) + fabs(rv1[
i])));
177 for (
int i =
n - 1;
i >= 0;
i--)
183 for (
int j = l; j <
n; j++)
184 v[j*
n+
i] = a[
i*str+j] / a[
i*str+l] /
g;
186 for (
int j = l; j <
n; j++)
189 for (
int k = l;
k <
n;
k++)
190 s += a[
i*str+
k] *
v[
k*
n+j];
191 for (
int k = l;
k <
n;
k++)
195 for (
int j = l; j <
n; j++)
196 v[
i*
n+j] =
v[j*
n+
i] = 0.0;
204 for (
int i =
n - 1;
i >= 0;
i--)
209 for (
int j = l; j <
n; j++)
216 for (
int j = l; j <
n; j++)
219 for (
int k = l;
k <
m;
k++)
220 s += a[
k*str+
i] * a[
k*str+j];
221 f = (s / a[
i*str+
i]) *
g;
222 for (
int k =
i;
k <
m;
k++)
223 a[
k*str+j] +=
f * a[
k*str+
i];
226 for (
int j =
i; j <
m; j++)
227 a[j*str+
i] = a[j*str+
i]*
g;
231 for (
int j =
i; j <
m; j++)
238 for (
int k =
n - 1;
k >= 0;
k--)
240 const int max_its = 30;
241 for (
int its = 0; its <= max_its; its++)
245 for (l =
k; l >= 0; l--)
248 if (fabs(rv1[l]) + anorm == anorm)
253 if (l == 0 || fabs(w[nm]) + anorm == anorm)
259 for (
int i = l;
i <=
k;
i++)
262 if (fabs(
f) + anorm != anorm)
270 for (
int j = 0; j <
m; j++)
274 a[j*str+nm] = y * c + z * s;
275 a[j*str+
i] = z * c - y * s;
286 for (
int j = 0; j <
n; j++)
291 if (its >= max_its) {
292 fprintf(stderr,
"[svd] no convergence after %d iterations\n", its);
303 f = ((y - z) * (y + z) + (
g - h) * (
g + h)) / (2.0 * h * y);
305 f = ((
x - z) * (
x + z) + h * ((y / (
f +
SIGN(
g,
f))) - h)) /
x;
309 for (
int j = l; j <= nm; j++)
324 for (
int jj = 0; jj <
n; jj++)
328 v[jj*
n+j] =
x * c + z * s;
329 v[jj*
n+
i] = z * c -
x * s;
339 f = (c *
g) + (s * y);
340 x = (c * y) - (s *
g);
341 for (
int jj = 0; jj <
m; jj++)
345 a[jj*str+j] = y * c + z * s;
346 a[jj*str+
i] = z * c - y * s;
#define m
Definition basecurve.c:277
const float i
Definition colorspaces_inline_conversions.h:440
const float g
Definition colorspaces_inline_conversions.h:674
const dt_aligned_pixel_t f
Definition colorspaces_inline_conversions.h:102
const float n
Definition colorspaces_inline_conversions.h:678
#define dt_free(ptr)
Definition darktable.h:456
const char flag
Definition image.h:218
static const float x
Definition iop_profile.h:235
const float v
Definition iop_profile.h:221
float *const restrict const size_t k
Definition luminance_mask.h:78
static double PYTHAG(double a, double b)
Definition svd.h:47
static double SIGN(double a, double b)
Definition svd.h:41
static int dsvd(double *a, int m, int n, int str, double *w, double *v)
Compute the singular value decomposition of a dense matrix.
Definition svd.h:80
#define MAX(a, b)
Definition thinplate.c:29