43 for(
int k = 0; k < n; ++k)
47 for(
int i = k + 1; i < n; ++i)
48 if(fabs(
A[k + n * i]) > fabs(
A[k + n *
m]))
m = i;
51 double t1 =
A[k + n *
m];
52 A[k + n *
m] =
A[k + n * k];
56 for(
int i = k + 1; i < n; ++i)
A[k + n * i] /= -t1;
59 for(
int i = k + 1; i < n; ++i)
61 double t2 =
A[i + n *
m];
62 A[i + n *
m] =
A[i + n * k];
65 for(
int j = k + 1; j < n; ++j)
66 for(
int i = k + 1; i < n; ++i)
A[i + n * j] +=
A[k + j * n] *
A[i + k * n];
79 for(
int k = 0; k < n - 1; ++k)
85 for(
int i = k + 1; i < n; ++i) b[i] +=
A[k + n * i] * t;
88 for(
int k = n - 1; k > 0; --k)
92 for(
int i = 0; i < k; ++i) b[i] -=
A[k + n * i] * t;
99 int *p = malloc(n *
sizeof(*p));
109 double *
const restrict A_square,
110 const size_t m,
const size_t n)
114 for(
size_t i = 0; i < n; ++i)
115 for(
size_t j = 0; j < n; ++j)
118 for(
size_t k = 0; k <
m; ++k)
119 sum +=
A[k * n + i] *
A[k * n + j];
121 A_square[i * n + j] = sum;
130 double *
const restrict y,
131 double *
const restrict y_square,
132 const size_t m,
const size_t n)
135 for(
size_t i = 0; i < n; ++i)
138 for(
size_t k = 0; k <
m; ++k)
139 sum +=
A[k * n + i] * y[k];
149 double *
const restrict y,
150 const size_t m,
const size_t n,
const int checks)
158 fprintf(stderr,
"pseudo solve: cannot cast %zu \303\227 %zu matrix\n",
m, n);
162 double *
const restrict A_square =
dt_alloc_align(n * n *
sizeof(
double));
163 double *
const restrict y_square =
dt_alloc_align(n *
sizeof(
double));
165 if(y_square == NULL || A_square == NULL)
goto error;
168 #pragma omp parallel sections
190 for(
size_t k = 0; k < n; k++) y[k] = y_square[k];
static void error(char *msg)
Definition ashift_lsd.c:191
#define m
Definition basecurve.c:231
#define A(y, x)
Definition colorspaces.c:148
#define __DT_CLONE_TARGETS__
Definition darktable.h:249
#define dt_free_align(A)
Definition darktable.h:334
static int pseudo_solve_gaussian(double *const restrict A, double *const restrict y, const size_t m, const size_t n, const int checks)
Definition gaussian_elimination.h:148
static __DT_CLONE_TARGETS__ int transpose_dot_vector(double *const restrict A, double *const restrict y, double *const restrict y_square, const size_t m, const size_t n)
Definition gaussian_elimination.h:129
static int gauss_make_triangular(double *A, int *p, int n)
Definition gaussian_elimination.h:40
static void gauss_solve_triangular(const double *A, const int *p, double *b, int n)
Definition gaussian_elimination.h:76
static int gauss_solve(double *A, double *b, int n)
Definition gaussian_elimination.h:97
static __DT_CLONE_TARGETS__ int transpose_dot_matrix(double *const restrict A, double *const restrict A_square, const size_t m, const size_t n)
Definition gaussian_elimination.h:108
#define dt_alloc_align(B)
Definition tests/cache.c:22