72 double *
const scales =
gv_calloc(n,
sizeof(
double));
74 for (
int i = 0; i < n; i++) {
77 for (
int j = 0; j < n; j++)
78 biggest = fmax(biggest, fabs(lu->
lu[i][j] = a[i][j]));
80 scales[i] = 1.0 / biggest;
89 for (
int k = 0, pivotindex = 0; k < n - 1; k++) {
92 for (
int i = k; i < n; i++) {
93 const double tempf = fabs(lu->
lu[lu->
ps[i]][k]) * scales[lu->
ps[i]];
94 if (biggest < tempf) {
104 if (pivotindex != k) {
105 SWAP(&lu->
ps[k], &lu->
ps[pivotindex]);
109 const double pivot = lu->
lu[lu->
ps[k]][k];
110 for (
int i = k + 1; i < n; i++) {
111 const double mult = lu->
lu[lu->
ps[i]][k] = lu->
lu[lu->
ps[i]][k] / pivot;
112 for (
int j = k + 1; j < n; j++)
113 lu->
lu[lu->
ps[i]][j] -= mult * lu->
lu[lu->
ps[k]][j];
118 if (lu->
lu[lu->
ps[n - 1]][n - 1] == 0.0) {
139 for (
int i = 0; i < n; i++) {
141 for (
int j = 0; j < i; j++)
142 dot += lu->
lu[lu->
ps[i]][j] * x[j];
143 x[i] = (lu->
ps[i] == bi) -
dot;
147 for (
int i = n - 1; i >= 0; i--) {
149 for (
int j = i + 1; j < n; j++)
150 dot += lu->
lu[lu->
ps[i]][j] * x[j];
151 x[i] = (x[i] -
dot) / lu->
lu[lu->
ps[i]][i];
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
Arithmetic helper functions.
void lu_solve(const lu_t *lu, double *x, int bi, int n)
void lu_free(lu_t *lu)
release resources relating to LU decomposition
int lu_decompose(lu_t *lu, double **a, int n)
NEATOPROCS_API void free_array(double **rv)
NEATOPROCS_API double ** new_array(int i, int j, double val)
state for working on LU decomposition
double ** lu
composite of upper and lower triangular matrices