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