GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <math.h> 00002 00003 #include <grass/gis.h> 00004 #include <grass/stats.h> 00005 00006 void c_quant(DCELL * result, DCELL * values, int n, const void *closure) 00007 { 00008 double quant = *(const double *)closure; 00009 double k; 00010 int i0, i1; 00011 00012 n = sort_cell(values, n); 00013 00014 if (n < 1) { 00015 G_set_d_null_value(result, 1); 00016 return; 00017 } 00018 00019 k = n * quant; 00020 i0 = (int)floor(k); 00021 i1 = (int)ceil(k); 00022 00023 *result = (i0 == i1) 00024 ? values[i0] 00025 : values[i0] * (i1 - k) + values[i1] * (k - i0); 00026 } 00027 00028 void c_quart1(DCELL * result, DCELL * values, int n, const void *closure) 00029 { 00030 static const double q = 0.25; 00031 c_quant(result, values, n, &q); 00032 } 00033 00034 void c_quart3(DCELL * result, DCELL * values, int n, const void *closure) 00035 { 00036 static const double q = 0.75; 00037 c_quant(result, values, n, &q); 00038 } 00039 00040 void c_perc90(DCELL * result, DCELL * values, int n, const void *closure) 00041 { 00042 static const double q = 0.90; 00043 c_quant(result, values, n, &q); 00044 } 00045 00046 void w_quant(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00047 { 00048 double quant = *(const double *)closure; 00049 DCELL total; 00050 int i; 00051 DCELL k; 00052 00053 n = sort_cell_w(values, n); 00054 00055 if (n < 1) { 00056 G_set_d_null_value(result, 1); 00057 return; 00058 } 00059 00060 total = 0.0; 00061 for (i = 0; i < n; i++) 00062 total += values[i][1]; 00063 00064 k = 0.0; 00065 for (i = 0; i < n; i++) { 00066 k += values[i][1]; 00067 if (k >= total * quant) 00068 break; 00069 } 00070 00071 *result = values[i][0]; 00072 } 00073 00074 void w_quart1(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00075 { 00076 static const double q = 0.25; 00077 w_quant(result, values, n, &q); 00078 } 00079 00080 void w_quart3(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00081 { 00082 static const double q = 0.75; 00083 w_quant(result, values, n, &q); 00084 } 00085 00086 void w_perc90(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00087 { 00088 static const double q = 0.90; 00089 w_quant(result, values, n, &q); 00090 }