00001 #include <stdlib.h>
00002 #include "magic/mmath.h"
00003 #include "magic/mcoord.h"
00004 #include "magic/mmagisupp.h"
00005
00006 #ifndef RAND_MAX
00007 #define RAND_MAX 32767
00008 #endif
00009
00010
00011 double sum (const Vector& x) {
00012 double res = 0.0;
00013 for (int i=0; i<x.size; i++)
00014 res += x[i];
00015 return res;
00016 }
00017
00018 double min (const Vector& x) {
00019 double min = UNDEFINED_FLOAT;
00020 for (int i=0; i<x.size; i++)
00021 if (!is_undef(x[i]) && x[i]<min)
00022 min = x[i];
00023 return min;
00024 }
00025
00026 int minIndex (const Vector& x) {
00027 double min = UNDEFINED_FLOAT;
00028 int minI=0;
00029 for (int i=0; i<x.size; i++)
00030 if (!is_undef(x[i]) && x[i]<min) {
00031 min = x[i];
00032 minI = i;
00033 }
00034 return minI;
00035 }
00036
00037 double max (const Vector& x) {
00038 double max = -UNDEFINED_FLOAT;
00039 for (int i=0; i<x.size; i++)
00040 if (!is_undef(x[i]) && x[i]>max)
00041 max = x[i];
00042 return max;
00043 }
00044
00045 int maxIndex (const Vector& x) {
00046 double max = -UNDEFINED_FLOAT;
00047 int maxI=0;
00048 for (int i=0; i<x.size; i++)
00049 if (!is_undef(x[i]) && x[i]>max) {
00050 max = x[i];
00051 maxI = i;
00052 }
00053 return maxI;
00054 }
00055
00056 double avg (const Vector& x) {
00057 return sum (x) / x.size;
00058 }
00059
00060 double stddev (const Vector& x) {
00061 double avg = ::avg (x);
00062 double res = 0.0;
00063 for (int i=0; i<x.size; i++)
00064 res += sqr (x[i]-avg);
00065 return sqrt (res/(x.size+1));
00066 }
00067
00068 double stdmerr (const Vector& x) {
00069 return stddev(x)/sqrt(double(x.size));
00070 }
00071
00072 Vector histogram (const Vector& x, int n) {
00073 Vector result;
00074
00075
00076 result.make (n);
00077 for (int i=0; i<result.size; i++)
00078 result[i] = 0.0;
00079
00080
00081 double mi=min(x), ma=max(x);
00082 double mul = double(n-1)/(ma-mi);
00083
00084
00085 int pos=0;
00086 for (int i=0; i<x.size; i++) {
00087 pos = int(mul*(x[i]-mi));
00088 result[pos] = result[pos] + 1.0;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 return result;
00108 }
00109
00110 void add (Vector& x, double a) {
00111 for (int i=0; i<x.size; i++)
00112 x[i] += a;
00113 }
00114
00115 void multiply (Vector& x, double m) {
00116 for (int i=0; i<x.size; i++)
00117 x[i] *= m;
00118 }
00119
00120 void multiplyToUnity (Vector& x) {
00121 double xsum = sum (x);
00122 if (xsum==0)
00123 add (x, 1.0/x.size);
00124 else
00125 multiply (x, 1/xsum);
00126 }
00127
00128
00130
00131
00132
00133
00134
00135
00136
00138
00139 void Coord2D::copy (const Coord3D& o) {
00140 x=o.x;
00141 y=o.y;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156