Main Page   Class Hierarchy   Compound List   File List   Compound Members  

mmath.cc

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     // Init histogram
00076     result.make (n);
00077     for (int i=0; i<result.size; i++)
00078         result[i] = 0.0;
00079 
00080     // Find minima and maxima
00081     double mi=min(x), ma=max(x);
00082     double mul = double(n-1)/(ma-mi);
00083 
00084     // Make histogram
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     // Calculate means
00093     int meanrange=2;
00094     Vector result2 (n);
00095     for (int i=0; i<result.size; i++) {
00096         int values=0;
00097         double sum = 0.0;
00098         for (int m=-meanrange; m<=meanrange; m++)
00099             if (i+m>=0 && i+m<result.size) {
00100                 sum += result[i+m];
00101                 values++;
00102             }
00103         result2[i] = sum/double(values);
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 double quadatan (double y, double x) {
00146     double at=atan (y/x);
00147     
00148     // Tuodaan oikeaan kvadranttiin
00149     if (x<0 && y>0) at+=M_PI;
00150     if (x<0 && y<0) at+=M_PI;
00151     if (x>0 && y<0) at+=2*M_PI;
00152     
00153     return at;
00154 }
00155 */
00156 

Generated at Tue Dec 4 19:53:26 2001 for MagiC++ by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001