o_var.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <grass/gis.h>
  6. #include <grass/raster.h>
  7. #include <grass/glocale.h>
  8. #include "method.h"
  9. #define MEM 1024
  10. /* function prototypes */
  11. static int m_var(double *, int, double *);
  12. int o_var(const char *basemap, const char *covermap, const char *outputmap,
  13. int usecats, struct Categories *cats)
  14. {
  15. struct Popen stats_child, reclass_child;
  16. FILE *stats, *reclass;
  17. int first, mem, i, count;
  18. long basecat, covercat, catb, catc;
  19. double value, vari, x;
  20. double *tab;
  21. mem = MEM * sizeof(double);
  22. tab = (double *)G_malloc(mem);
  23. stats = run_stats(&stats_child, basemap, covermap, "-cn");
  24. reclass = run_reclass(&reclass_child, basemap, outputmap);
  25. first = 1;
  26. while (read_stats(stats, &basecat, &covercat, &value)) {
  27. if (first) {
  28. first = 0;
  29. catb = basecat;
  30. catc = covercat;
  31. i = 0;
  32. count = 0;
  33. }
  34. if (basecat != catb) {
  35. m_var(tab, count, &vari);
  36. fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari);
  37. /*fprintf (stdout, "1. %ld = %ld %f\n", catb, catb, vari); */
  38. catb = basecat;
  39. catc = covercat;
  40. count = 0;
  41. }
  42. if (usecats)
  43. sscanf(Rast_get_c_cat((CELL *) &covercat, cats), "%lf", &x);
  44. else
  45. x = covercat;
  46. for (i = 0; i < value; i++) {
  47. if (count * sizeof(double) >= mem) {
  48. mem += MEM * sizeof(double);
  49. tab = (double *)G_realloc(tab, mem);
  50. /* fprintf(stderr,"MALLOC: %d KB needed\n",(int)(mem/1024)); */
  51. }
  52. tab[count++] = x;
  53. }
  54. }
  55. if (first) {
  56. catb = catc = 0;
  57. }
  58. m_var(tab, count, &vari);
  59. fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari);
  60. G_debug(5, "2. %ld = %ld %f", catb, catb, vari);
  61. G_popen_close(&stats_child);
  62. G_popen_close(&reclass_child);
  63. return 0;
  64. }
  65. /***********************************************************************
  66. *
  67. * Given an array of data[1...n], this routine returns its variance.
  68. *
  69. ************************************************************************/
  70. static int m_var(double *data, int n, double *vari)
  71. {
  72. double ave, ep, s;
  73. int i;
  74. if (n < 1) {
  75. G_warning(_("o_var: No data in array"));
  76. return (1);
  77. }
  78. *vari = 0.0;
  79. ep = 0;
  80. s = 0.0;
  81. for (i = 0; i < n; i++) /* First pass to get the mean */
  82. s += data[i];
  83. ave = s / n;
  84. for (i = 0; i < n; i++) {
  85. s = data[i] - ave;
  86. /*fprintf(stderr,"s: %lf data[i]: %lf ave: %lf n: %d\n",s,data[i],ave,n); */
  87. *vari += s * s;
  88. ep += s;
  89. }
  90. *vari = (*vari - ep * ep / n) / (n - 1);
  91. return (0);
  92. }