123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #include <grass/gis.h>
- #include <math.h>
- #define MAX_ITERS 30
- #define SIGN(a,b) ((b)<0 ? -fabs(a) : fabs(a))
- int G_tqli(double d[], double e[], int n, double **z)
- {
- int m, l, iter, i, k;
- double s, r, p, g, f, dd, c, b;
- for (i = 1; i < n; i++)
- e[i - 1] = e[i];
- e[n - 1] = 0.0;
- for (l = 0; l < n; l++) {
- iter = 0;
- do {
- for (m = l; m < n - 1; m++) {
- dd = fabs(d[m]) + fabs(d[m + 1]);
- if (fabs(e[m]) + dd == dd)
- break;
- }
- if (m != l) {
- if (iter++ == MAX_ITERS)
- return 0; /* Too many iterations in TQLI */
- g = (d[l + 1] - d[l]) / (2.0 * e[l]);
- r = sqrt((g * g) + 1.0);
- g = d[m] - d[l] + e[l] / (g + SIGN(r, g));
- s = c = 1.0;
- p = 0.0;
- for (i = m - 1; i >= l; i--) {
- f = s * e[i];
- b = c * e[i];
- if (fabs(f) >= fabs(g)) {
- c = g / f;
- r = sqrt((c * c) + 1.0);
- e[i + 1] = f * r;
- c *= (s = 1.0 / r);
- }
- else {
- s = f / g;
- r = sqrt((s * s) + 1.0);
- e[i + 1] = g * r;
- s *= (c = 1.0 / r);
- }
- g = d[i + 1] - p;
- r = (d[i] - g) * s + 2.0 * c * b;
- p = s * r;
- d[i + 1] = g + p;
- g = c * r - b;
- /* Next loop can be omitted if eigenvectors not wanted */
- for (k = 0; k < n; k++) {
- f = z[k][i + 1];
- z[k][i + 1] = s * z[k][i] + c * f;
- z[k][i] = c * z[k][i] - s * f;
- }
- }
- d[l] = d[l] - p;
- e[l] = g;
- e[m] = 0.0;
- }
- } while (m != l);
- }
- return 1;
- }
- void G_tred2(double **a, int n, double d[], double e[])
- {
- int l, k, j, i;
- double scale, hh, h, g, f;
- for (i = n - 1; i >= 1; i--) {
- l = i - 1;
- h = scale = 0.0;
- if (l > 0) {
- for (k = 0; k <= l; k++)
- scale += fabs(a[i][k]);
- if (scale == 0.0)
- e[i] = a[i][l];
- else {
- for (k = 0; k <= l; k++) {
- a[i][k] /= scale;
- h += a[i][k] * a[i][k];
- }
- f = a[i][l];
- g = f > 0 ? -sqrt(h) : sqrt(h);
- e[i] = scale * g;
- h -= f * g;
- a[i][l] = f - g;
- f = 0.0;
- for (j = 0; j <= l; j++) {
- /* Next statement can be omitted if eigenvectors not wanted */
- a[j][i] = a[i][j] / h;
- g = 0.0;
- for (k = 0; k <= j; k++)
- g += a[j][k] * a[i][k];
- for (k = j + 1; k <= l; k++)
- g += a[k][j] * a[i][k];
- e[j] = g / h;
- f += e[j] * a[i][j];
- }
- hh = f / (h + h);
- for (j = 0; j <= l; j++) {
- f = a[i][j];
- e[j] = g = e[j] - hh * f;
- for (k = 0; k <= j; k++)
- a[j][k] -= (f * e[k] + g * a[i][k]);
- }
- }
- }
- else
- e[i] = a[i][l];
- d[i] = h;
- }
- /* Next statement can be omitted if eigenvectors not wanted */
- d[0] = 0.0;
- e[0] = 0.0;
- /* Contents of this loop can be omitted if eigenvectors not
- wanted except for statement d[i]=a[i][i]; */
- for (i = 0; i < n; i++) {
- l = i - 1;
- if (d[i]) {
- for (j = 0; j <= l; j++) {
- g = 0.0;
- for (k = 0; k <= l; k++)
- g += a[i][k] * a[k][j];
- for (k = 0; k <= l; k++)
- a[k][j] -= g * a[k][i];
- }
- }
- d[i] = a[i][i];
- a[i][i] = 1.0;
- for (j = 0; j <= l; j++)
- a[j][i] = a[i][j] = 0.0;
- }
- }
|