71 double pivot, biggest, mult, tempf;
81 for (i = 0; i < n; i++) {
84 for (j = 0; j < n; j++)
85 biggest = fmax(biggest, fabs(
lu[i][j] = a[i][j]));
95 for (k = 0; k < n - 1; k++) {
98 for (i = k; i < n; i++) {
99 if (biggest < (tempf = fabs(
lu[
ps[i]][k]) *
scales[
ps[i]])) {
106 if (pivotindex != k) {
108 ps[k] =
ps[pivotindex];
113 pivot =
lu[
ps[k]][k];
114 for (i = k + 1; i < n; i++) {
115 lu[
ps[i]][k] = mult =
lu[
ps[i]][k] / pivot;
116 for (j = k + 1; j < n; j++)
117 lu[
ps[i]][j] -= mult *
lu[
ps[k]][j];
121 if (
lu[
ps[n - 1]][n - 1] == 0.0)
143 for (i = 0; i < n; i++) {
145 for (j = 0; j < i; j++)
147 x[i] = b[
ps[i]] -
dot;
151 for (i = n - 1; i >= 0; i--) {
153 for (j = i + 1; j < n; j++)
155 x[i] = (x[i] -
dot) /
lu[
ps[i]][i];
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
void lu_solve(double *x, double *b, int n)
int lu_decompose(double **a, int n)
NEATOPROCS_API void free_array(double **rv)
NEATOPROCS_API double ** new_array(int i, int j, double val)