OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / src / Objects / General / eosMath / src / eosMathStatistics.c
1 /*
2 # %M% %Y% %I%
3 # The latest update : %G% at %U%
4 #
5 #%Z% eosMathStatistics ver %I%
6 #%Z% Created by 
7 #%Z%
8 #%Z% Usage : eosMathStatistics 
9 #%Z% Attention
10 #%Z%
11 */
12 static char __sccs_id[] = "%Z%eosMathStatistics ver%I%; Date:%D% %Z%";
13
14 #include "../inc/eosMath.h"
15 #include "genUtil.h"
16 #include "Memory.h"
17
18
19 void
20 eosMathSorting(double* v, int n)
21 {
22   int i, j;
23   double tmp;
24   for(i=0; i<n-1; i++) {
25     for(j=0; j<n-1; j++) {
26       if(v[j]>v[j+1]) {
27         tmp = v[j];
28         v[j] = v[j+1];
29         v[j+1] = tmp;
30       }
31     }
32   }
33 }
34
35 double
36 eosMathMedian(double* v, int n)
37 {
38   int i;
39   double* tmp;
40   double med;
41   tmp = memoryAllocate(sizeof(double)*n, "in eosMathMedian");
42   for(i=0; i<n; i++) {
43     tmp[i] = v[i];
44   }
45   eosMathSorting(tmp, n);
46   if(n%2) {
47     med = (tmp[n/2-1]+tmp[n/2])/2.0;
48   } else {
49     med = tmp[n/2]; 
50   }
51
52   free(tmp);
53   return med;
54 }
55
56
57 double
58 eosMathAverage(double* v, int n)
59 {
60   int i;
61   double sum;
62   sum = 0;
63   for(i=0; i<n; i++) {
64     sum += v[i];
65   }
66   return sum/n;  
67 }
68
69 double
70 eosMathStddev(double* v, double mean, int n)
71 {
72   int i;
73   double sum;
74   sum = 0;
75   for(i=0; i<n; i++) {
76     sum += SQR(v[i]-mean);
77   }
78   if(0<sum) {
79     return sqrt(sum/n);
80   } else {
81     return 0;
82   }
83 }
84
85
86 double
87 eosMathTrimmedAverage(double* v, int n, double trim)
88 {
89
90   int i;
91   int nn;
92   int iStart;
93   double* tmp;
94   double* tmp2;
95   double avg;
96
97   nn = (int)(n*(1-trim*2)+0.5);
98   iStart = (int)(n*trim+0.5) ;
99
100   tmp = memoryAllocate(sizeof(double)*n, "in eosMathMedian");
101   tmp2 = memoryAllocate(sizeof(double)*nn, "in eosMathMedian");
102   for(i=0; i<n; i++) {
103     tmp[i] = v[i];
104   }
105   eosMathSorting(tmp, n);
106
107   for(i=0; i<nn; i++) {
108     tmp2[i] = tmp[i+iStart];
109   }
110   avg = eosMathAverage(tmp2, nn);
111
112   free(tmp);
113   free(tmp2);
114
115   return avg;
116 }
117
118
119 double
120 eosMathHodgesLehmannEstimator(double* v, int n)
121 {
122
123   int i, j, k;
124   int nn;
125   double* tmp;
126   double avg;
127
128   nn = n*(n-1)/2;
129   tmp = memoryAllocate(sizeof(double)*nn, "in eosMathMedian");
130
131   k=0;
132   for(i=0; i<n; i++) {
133   for(j=1; j<n; j++) {
134     tmp[k] = (v[i] + v[j])/2.0;
135     k++;
136   }
137   }
138   eosMathSorting(tmp, nn);
139
140   if(nn%2) {
141     avg = (tmp[nn/2-1]+tmp[nn/2])/2.0;
142   } else {
143     avg = tmp[nn/2]; 
144   }
145
146   free(tmp);
147   return avg;
148 }
149
150