[ 簡単な説明 ] 標準統計量を計算するライブラリです。 本ライブラリの本体は、stat( ) ですが、データ処理を行うのに有用な数値用のクイックソートルーチンと、データのスワップルーチンを準備しました。 stat( )は、数多くの統計量を計算するため、多くのパラメータを引数として要求しますが、実使用においては不要なパラメータも多いと思います。ソースを適当に改造して使用してください。 |
関数名 | 関数の機能 | 呼び出し例 | ||
sorti1( ) | int 型データ | 昇順ソート | sorti1(a, n); | |
sorti2( ) | 降順ソート | sorti2(a, n); | ||
sortii1( ) | 間接昇順ソート | sortii1(a, n, jun); | ||
sortii2( ) | 間接降順ソート | sortii2(a, n, jun); | ||
sortd1( ) | double 型データ | 昇順ソート | sortd1(a, n); | |
sortd2( ) | 降順ソート | sortd2(a, n); | ||
sortdi1( ) | 間接昇順ソート | sortdi1(a, n, jun); | ||
sortdi2( ) | 間接降順ソート | sortdi2(a, n, jun); | ||
swapi( ) | データ入替え | int 型データ | swapi(&a, &b); | |
swapd( ) | double 型データ | swapd(&a, &b); | ||
swapc( ) | char 型データ | swapc(&a, &b); | ||
swapx( ) | Complex 型データ | swapx(&a, &b); | ||
stat( ) | 基本統計量計算 | stat(a, n, &min, &max, &, &sum, &sum2, &ave, &gmean, &hmean, &amad, &s, &v, &st, &uv, &squv, &cv, &sk, &ku); |
||
min | : 最小値 | minimum | ||
max | : 最大値 | maximum | ||
amp | : 中点値 | mid point | ||
sum | : 総和 | total, sum | ||
sum2 | : 二乗和 | sum of square | ||
ave | : 算術平均値 | arithmetic mean | ||
gmean | : 幾何平均値 | geometric mean | ||
hmean | : 調和平均値 | harmonic mean | ||
amad | : 平均絶対偏差 | mean absolute deviation | ||
s | : 偏差平方和 | sum of square of deviation | ||
v | : 分散 | variance | ||
st | : 標準偏差 | standard deviation | ||
uv | : 不偏分散 | unbiased estimate of population variance | ||
squv | : 不偏分散平方根 | square root of UV | ||
cv | : 算術平均に対する 変動係数 | coefficient of variance | ||
sk | : 歪度 | skewness | ||
ku | : 尖度 | kurtosis |
/* basstat.c */ #include <stdio.h> #include "sslib.h" void sorti1(int a[], int n) { int i, j, k, l, r, s, x, w, st1[32], st2[32]; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sorti1()\n"); return; } s = 0; st1[0] = 0; st2[0] = n - 1; do { l = st1[s]; r = st2[s]; s--; if(r - l < 11) { i = l; while(i < r) { k = i++; j = i; while(*(a + k) > *(a + j)) { w = *(a + k); *(a + k) = *(a + j); *(a + j) = w; if(j <= l + 1) break; j = k--; } } } else { for(;;) { i = l; j = r; x = *(a + (int)((l + r) / 2)); for(;;) { while(x > *(a + i)) i++; while(*(a + j) > x) j--; if(i > j) break; w = *(a + i); *(a + i++) = *(a + j); *(a + j--) = w; if(i > j) break; } if(j - l < r - i) { if(i < r) { s++; st1[s] = i; st2[s] = r; } r = j; } else { if(l < j) { s++; st1[s] = l; st2[s] = j; } l = i; } if(l >= r) break; } } } while(s >= 0); return; } void sorti2(int a[], int n) { int *p, *q, w; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sorti2()\n"); return; } sorti1(a, n); p = a; q = a + n - 1; while(p < q) { w = *p; *p++ = *q; *q-- = w; } return; } void sortii1(int a[], int n, int jun[]) { int i, j, k, l, *p, r, s, w, x, st1[32], st2[32]; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortii1()\n"); return; } for(i = 0, p = jun; i < n; i++) *p++ = i; s = 0; st1[0] = 0; st2[0] = n - 1; do { l = st1[s]; r = st2[s]; s--; if(r - l < 11) { i = l; while(i < r) { k = i++; j = i; while(*(a + *(jun + k)) > *(a + *(jun + j))) { w = *(jun + k); *(jun + k) = *(jun + j); *(jun + j) = w; if (j <= l + 1) break; j = k--; } } } else { for(;;) { i = l; j = r; x = *(a + *(jun + (int)((l + r) / 2))); for(;;) { while(x > *(a + *(jun + i))) i++; while(*(a + *(jun + j)) > x) j--; if(i > j) break; w = *(jun + i); *(jun + i++) = *(jun + j); *(jun + j--) = w; if(i > j) break; } if(j - l < r - i) { if(i < r) { s++; st1[s] = i; st2[s] = r; } r = j; } else { if(l < j) { s++; st1[s] = l; st2[s] = j; } l = i; } if(l >= r) break; } } } while(s >= 0); return; } void sortii2(int a[], int n, int jun[]) { int *p, *q, w; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortii2()\n"); return; } sortii1(a, n, jun); p = jun; q = jun + n - 1; while(p < q) { w = *p; *p++ = *q; *q-- = w; } return; } void sortd1(double a[], int n) { int i, j, k, l, r, s, st1[32], st2[32]; double x, w; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortd1()\n"); return; } s = 0; st1[0] = 0; st2[0] = n - 1; do { l = st1[s]; r = st2[s]; s--; if(r - l < 11) { i = l; while(i < r) { k = i++; j = i; while(*(a + k) > *(a + j)) { w = *(a + k); *(a + k) = *(a + j); *(a + j) = w; if(j <= l + 1) break; j = k--; } } } else { for(;;) { i = l; j = r; x = *(a + (int)((l + r) / 2)); for(;;) { while(x > *(a + i)) i++; while(*(a + j) > x) j--; if(i > j) break; w = *(a + i); *(a + i++) = *(a + j); *(a + j--) = w; if(i > j) break; } if(j - l < r - i) { if(i < r) { s++; st1[s] = i; st2[s] = r; } r = j; } else { if(l < j) { s++; st1[s] = l; st2[s] = j; } l = i; } if(l >= r) break; } } } while(s >= 0); return; } void sortd2(double a[], int n) { double *p, *q, w; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortd2()\n"); return; } sortd1(a, n); p = a; q = a + n - 1; while(p < q) { w = *p; *p++ = *q; *q-- = w; } return; } void sortdi1(double a[], int n, int jun[]) { int i, j, k, l, *p, r, s, w, st1[32], st2[32]; double x; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortdi1()\n"); return; } for(i = 0, p = jun; i < n; i++) *p++ = i; s = 0; st1[0] = 0; st2[0] = n - 1; do { l = st1[s]; r = st2[s]; s--; if(r - l < 11) { i = l; while(i < r) { k = i++; j = i; while(*(a + *(jun + k)) > *(a + *(jun + j))) { w = *(jun + k); *(jun + k) = *(jun + j); *(jun + j) = w; if(j <= l + 1) break; j = k--; } } } else { for(;;) { i = l; j = r; x = *(a + *(jun + (int)((l + r) / 2))); for(;;) { while(x > *(a + *(jun + i))) i++; while(*(a + *(jun + j)) > x) j--; if(i > j) break; w = *(jun + i); *(jun + i++) = *(jun + j); *(jun + j--) = w; if(i > j) break; } if(j - l < r - i) { if(i < r) { s++; st1[s] = i; st2[s] = r; } r = j; } else { if(l < j) { s++; st1[s] = l; st2[s] = j; } l = i; } if(l >= r) break; } } } while(s >= 0); return; } void sortdi2(double a[], int n, int jun[]) { int *p, *q, w; if(n <= 1) { fprintf(stderr, "Error : n <= 1 in sortdi2()\n"); return; } sortdi1(a, n, jun); p = jun; q = jun + n - 1; while(p < q) { w = *p; *p++ = *q; *q-- = w; } return; } int stat(double a[], int n, double *min, double *max, double *amp, double *sum, double *sum2, double *ave, double *gmean, double *hmean, double *amad, double *s, double *v, double *st, double *uv, double *squv, double *cv, double *sk, double *ku) { double dn, *p, sum3, sum4, w, w3; int flag, i; if(n < 2) { fprintf(stderr, "Error : n < 2 in stat()\n"); return -1; } dn = (double)n; *min = *max = a[0]; *sum = *sum2 = sum3 = sum4 = 0.; for(i = 0, p = a; i < n; i++, p++) { if(*min > *p) *min = *p; else if(*max < *p) *max = *p; *sum += *p; *sum2 += (w = *p * *p); } *amp = (*min + *max) / 2.; *ave = *sum / dn; for(i = 0, *amad = 0., p = a; i < n; i++, p++) { *amad += fabs(w = *p - *ave); sum3 += (w3 = w * w * w); sum4 += (w3 * w); } *amad /= dn; *v = *sum2 / dn - *ave * *ave; *s = *v * dn; *st = sqrt(*v); *uv = *s / (dn - 1.); *squv = sqrt(*uv); *cv = sqrt(*v) / *ave * 100.; *sk = sum3 / dn / *st / *st / *st; *ku = sum4 / dn / *v / *v; for(i = 0, p = a, flag = 0, *gmean = *hmean = 0.; i < n; i++, p++) { if(*p == 0.) { fprintf(stderr, "Warning : (data) = 0 in geometric & harmonic mean calculation of stat()\n"); flag = 1; break; } if(*p < 0.) { fprintf(stderr, "Warning : (data) < 0 in geometric mean calculation of stat()\n"); flag = 1; break; } *gmean += log(*p); *hmean += 1. / *p; } if(flag) { *gmean = *hmean = 0.; return 1; } *gmean = exp(*gmean / dn); *hmean = dn / *hmean; return 0; } void swapi(int *a, int *b) { int w; w = *a; *a = *b; *b = w; return; } void swapd(double *a, double *b) { double w; w = *a; *a = *b; *b = w; return; } void swapc(char *a, char *b) { char w; w = *a; *a = *b; *b = w; return; } void swapx(Complex *a, Complex *b) { Complex w; w = *a; *a = *b; *b = w; return; } |