GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <grass/gis.h> 00002 00003 void c_var(DCELL * result, DCELL * values, int n, const void *closure) 00004 { 00005 DCELL sum, ave, sumsq; 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 } 00038 00039 *result = sumsq / count; 00040 } 00041 00042 void w_var(DCELL * result, DCELL(*values)[2], int n, const void *closure) 00043 { 00044 DCELL sum, ave, sumsq; 00045 int count; 00046 int i; 00047 00048 sum = 0.0; 00049 count = 0; 00050 00051 for (i = 0; i < n; i++) { 00052 if (G_is_d_null_value(&values[i][0])) 00053 continue; 00054 00055 sum += values[i][0] * values[i][1]; 00056 count += values[i][1]; 00057 } 00058 00059 if (count == 0) { 00060 G_set_d_null_value(result, 1); 00061 return; 00062 } 00063 00064 ave = sum / count; 00065 00066 sumsq = 0; 00067 00068 for (i = 0; i < n; i++) { 00069 DCELL d; 00070 00071 if (G_is_d_null_value(&values[i][0])) 00072 continue; 00073 00074 d = values[i][0] - ave; 00075 sumsq += d * d * values[i][1]; 00076 } 00077 00078 *result = sumsq / count; 00079 }