GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <grass/gis.h> 00002 00003 void c_kurt(DCELL * result, DCELL * values, int n, const void *closure) 00004 { 00005 DCELL sum, ave, sumsq, sumqt, var; 00006 int count; 00007 int i; 00008 00009 sum = 0.0; 00010 count = 0; 00011 00012 for (i = 0; i < n; i++) { 00013 if (G_is_d_null_value(&values[i])) 00014 continue; 00015 00016 sum += values[i]; 00017 count++; 00018 } 00019 00020 if (count == 0) { 00021 G_set_d_null_value(result, 1); 00022 return; 00023 } 00024 00025 ave = sum / count; 00026 00027 sumsq = 0; 00028 00029 for (i = 0; i < n; i++) { 00030 DCELL d; 00031 00032 if (G_is_d_null_value(&values[i])) 00033 continue; 00034 00035 d = values[i] - ave; 00036 sumsq += d * d; 00037 sumqt += d * d * d * d; 00038 } 00039 00040 var = sumsq / count; 00041 00042 *result = sumqt / (count * var * var) - 3; 00043 } 00044 00045 void w_kurt(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00046 { 00047 DCELL sum, ave, sumsq, sumqt, var; 00048 int count; 00049 int i; 00050 00051 sum = 0.0; 00052 count = 0; 00053 00054 for (i = 0; i < n; i++) { 00055 if (G_is_d_null_value(&values[i][0])) 00056 continue; 00057 00058 sum += values[i][0] * values[i][1]; 00059 count += values[i][1]; 00060 } 00061 00062 if (count == 0) { 00063 G_set_d_null_value(result, 1); 00064 return; 00065 } 00066 00067 ave = sum / count; 00068 00069 sumsq = 0; 00070 00071 for (i = 0; i < n; i++) { 00072 DCELL d; 00073 00074 if (G_is_d_null_value(&values[i][0])) 00075 continue; 00076 00077 d = values[i][0] - ave; 00078 sumsq += d * d * values[i][1]; 00079 sumqt += d * d * d * values[i][1]; 00080 } 00081 00082 var = sumsq / count; 00083 00084 *result = sumqt / (count * var * var) - 3; 00085 }