Переглянути джерело

added function to chose algorithm

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@32232 15284696-431f-4ddb-bdfa-cd5b030d7da7
Moritz Lennert 16 роки тому
батько
коміт
deddd63f9d
1 змінених файлів з 30 додано та 12 видалено
  1. 30 12
      lib/arraystats/class.c

+ 30 - 12
lib/arraystats/class.c

@@ -1,7 +1,32 @@
 /* functions to classify sorted arrays of doubles and fill a vector of classbreaks */
 
+#include <grass/glocale.h>
 #include <grass/arraystats.h>
 
+double class_apply_algorithm(char *algo, double *data, int nrec, int *nbreaks,
+			     double *classbreaks)
+{
+    double finfo = 0.0;
+
+    if (G_strcasecmp(algo, "int") == 0)
+	finfo = class_interval(data, nrec, *nbreaks, classbreaks);
+    else if (G_strcasecmp(algo, "std") == 0)
+	finfo = class_stdev(data, nrec, *nbreaks, classbreaks);
+    else if (G_strcasecmp(algo, "qua") == 0)
+	finfo = class_quant(data, nrec, *nbreaks, classbreaks);
+    else if (G_strcasecmp(algo, "equ") == 0)
+	finfo = class_equiprob(data, nrec, nbreaks, classbreaks);
+    else if (G_strcasecmp(algo, "dis") == 0)
+	finfo = class_discont(data, nrec, *nbreaks, classbreaks);
+    else
+	G_fatal_error(_("%s: Unknown algorithm"), algo);
+
+    if (finfo == 0)
+	G_fatal_error(_("%s: Error in classification algorithm"), algo);
+
+    return finfo;
+}
+
 int class_interval(double *data, int count, int nbreaks, double *classbreaks)
 {
     double min, max;
@@ -218,7 +243,7 @@ int class_equiprob(double *data, int count, int *nbreaks, double *classbreaks)
 
 double class_discont(double *data, int count, int nbreaks, double *classbreaks)
 {
-    int *num, nbclass, maxclass = 0;
+    int *num, nbclass;
     double *no, *zz, *nz, *xn, *co;
     double *x;			//Vecteur des observations standardisées
     int i, j, k;
@@ -233,7 +258,7 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
     int im = 0, ji = 0;
     int tmp = 0;
     int nff = 0, jj = 0, no1 = 0, no2 = 0;
-    double f = 0, xt1 = 0, xt2 = 0, chi2 = 0, xnj_1 = 0, xj_1 = 0;
+    double f = 0, xt1 = 0, xt2 = 0, chi2 = 1000.0, xnj_1 = 0, xj_1 = 0;
 
 
     /*get the number of values */
@@ -311,7 +336,7 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
 		dmax = d;
 		nmax = k;
 	    }
-	    nd--;	//A VERIFIER!
+	    nd--;		//A VERIFIER!
 	    if (x[nf] != x[nd]) {
 		if (nd != 0)
 		    co[j] = (xn[nf] - xn[nd]) / (x[nf] - x[nd]);
@@ -382,17 +407,10 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
 	    xt2 -= xt1;
 	}
 
-	/*if new class break not statistically significant (alpha > 0.05), give warning */
-	if (maxclass == 0) {
+	/* calculate chi-square to indicate statistical significance of new class, i.e. how probable would it be that the new class could be the result of purely random choice */
+	if (chi2 > pow((double)((no1 - no2) - (xt1 - xt2)), 2) / (xt1 + xt2))
 	    chi2 = pow((double)((no1 - no2) - (xt1 - xt2)), 2) / (xt1 + xt2);
-	    if (chi2 < 3.84148) {
 
-		G_warning(_
-			  ("discontinuities algorithm: %i class breaks or more are not statistically significant at alpha=0.05"),
-			  i);
-		maxclass = 1;
-	    }
-	}
     }
 
     /*  Fill up classbreaks of i <=nbclass classes */