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