GRASS GIS 8 Programmer's Manual  8.2.2dev(2023)-3d2c704037
eigen_tools.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <math.h>
3 #include <grass/gis.h>
4 #include <grass/gmath.h>
5 
6 static int egcmp(const void *pa, const void *pb);
7 
8 
9 int G_math_egvorder(double *d, double **z, long bands)
10 {
11  double *buff;
12  double **tmp;
13  int i, j;
14 
15  /* allocate temporary matrix */
16  buff = (double *)G_malloc(bands * (bands + 1) * sizeof(double));
17  tmp = (double **)G_malloc(bands * sizeof(double *));
18  for (i = 0; i < bands; i++)
19  tmp[i] = &buff[i * (bands + 1)];
20 
21  /* concatenate (vertically) z and d into tmp */
22  for (i = 0; i < bands; i++) {
23  for (j = 0; j < bands; j++)
24  tmp[i][j + 1] = z[j][i];
25  tmp[i][0] = d[i];
26  }
27 
28  /* sort the combined matrix */
29  qsort(tmp, bands, sizeof(double *), egcmp);
30 
31  /* split tmp into z and d */
32  for (i = 0; i < bands; i++) {
33  for (j = 0; j < bands; j++)
34  z[j][i] = tmp[i][j + 1];
35  d[i] = tmp[i][0];
36  }
37 
38  /* free temporary matrix */
39  G_free(tmp);
40  G_free(buff);
41 
42  return 0;
43 }
44 
45 /***************************************************************************/
46 
47 static int egcmp(const void *pa, const void *pb)
48 {
49  const double *a = *(const double *const *)pa;
50  const double *b = *(const double *const *)pb;
51 
52  if (*a > *b)
53  return -1;
54  if (*a < *b)
55  return 1;
56 
57  return 0;
58 }
59 /***************************************************************************/
#define G_malloc(n)
Definition: defs/gis.h:112
void G_free(void *)
Free allocated memory.
Definition: gis/alloc.c:149
int G_math_egvorder(double *d, double **z, long bands)
Definition: eigen_tools.c:9
double b
Definition: r_raster.c:39