GRASS 8 Programmer's Manual 8.6.0dev(2026)-608efca185
Loading...
Searching...
No Matches
lu.c
Go to the documentation of this file.
1#include <math.h>
2#include <grass/gis.h>
3#include <grass/gmath.h>
4
5#define TINY 1.0e-20;
6
7/*!
8 * \brief LU decomposition
9 *
10 * \param a double **
11 * \param n int
12 * \param indx int *
13 * \param d double *
14 *
15 * \return 0 on singular matrix, 1 on success
16 */
17int G_ludcmp(double **a, int n, int *indx, double *d)
18{
19 int i, imax = 0, j, k;
20 double big, dum, sum, temp;
21 double *vv;
22 int is_singular = FALSE;
23
24 vv = G_alloc_vector(n);
25 *d = 1.0;
26 for (i = 0; i < n; i++) {
27 big = 0.0;
28 for (j = 0; j < n; j++)
29 if ((temp = fabs(a[i][j])) > big)
30 big = temp;
31
32 if (big == 0.0) {
34 break;
35 }
36
37 vv[i] = 1.0 / big;
38 }
39 if (is_singular) {
40 *d = 0.0;
41 return 0; /* Singular matrix */
42 }
43
44 for (j = 0; j < n; j++) {
45 for (i = 0; i < j; i++) {
46 sum = a[i][j];
47 for (k = 0; k < i; k++)
48 sum -= a[i][k] * a[k][j];
49 a[i][j] = sum;
50 }
51
52 big = 0.0;
53 for (i = j; i < n; i++) {
54 sum = a[i][j];
55 for (k = 0; k < j; k++)
56 sum -= a[i][k] * a[k][j];
57 a[i][j] = sum;
58 if ((dum = vv[i] * fabs(sum)) >= big) {
59 big = dum;
60 imax = i;
61 }
62 }
63 if (j != imax) {
64 for (k = 0; k < n; k++) {
65 dum = a[imax][k];
66 a[imax][k] = a[j][k];
67 a[j][k] = dum;
68 }
69 *d = -(*d);
70 vv[imax] = vv[j];
71 }
72 indx[j] = imax;
73 if (a[j][j] == 0.0)
74 a[j][j] = TINY;
75 if (j != n) {
76 dum = 1.0 / (a[j][j]);
77 for (i = j + 1; i < n; i++)
78 a[i][j] *= dum;
79 }
80 }
82
83 return 1;
84}
85
86#undef TINY
87
88/*!
89 * \brief LU backward substitution
90 *
91 * \param a double **
92 * \param n int
93 * \param indx int *
94 * \param b double []
95 *
96 * \return void
97 */
98void G_lubksb(double **a, int n, int *indx, double b[])
99{
100 int i, ii, ip, j;
101 double sum;
102
103 ii = -1;
104 for (i = 0; i < n; i++) {
105 ip = indx[i];
106 sum = b[ip];
107 b[ip] = b[i];
108 if (ii >= 0)
109 for (j = ii; j < i; j++)
110 sum -= a[i][j] * b[j];
111 else if (sum)
112 ii = i;
113 b[i] = sum;
114 }
115 for (i = n - 1; i >= 0; i--) {
116 sum = b[i];
117 for (j = i + 1; j < n; j++)
118 sum -= a[i][j] * b[j];
119 b[i] = sum / a[i][i];
120 }
121}
double * G_alloc_vector(size_t)
Vector matrix memory allocation.
Definition dalloc.c:38
void G_free_vector(double *)
Vector memory deallocation.
Definition dalloc.c:118
#define TRUE
Definition gis.h:78
#define FALSE
Definition gis.h:82
int G_ludcmp(double **a, int n, int *indx, double *d)
LU decomposition.
Definition lu.c:17
void G_lubksb(double **a, int n, int *indx, double b[])
LU backward substitution.
Definition lu.c:98
#define TINY
Definition lu.c:5
double b
Definition r_raster.c:39