00001 #ifndef _NR_UTIL_H_
00002 #define _NR_UTIL_H_
00003
00004 #include <string>
00005 #include <cmath>
00006 #include <complex>
00007 #include <iostream>
00008 #include <stdlib.h>
00009 using namespace std;
00010
00011 typedef double DP;
00012
00013 template<class T>
00014 inline const T SQR(const T a) {return a*a;}
00015
00016 template<class T>
00017 inline const T SIGN(const T &a, const T &b) {return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a);}
00018
00019 template<class T>
00020 inline void SWAP(T &a, T &b) {T dum=a; a=b; b=dum;}
00021
00022 namespace NR {
00023 inline void nrerror(const string error_text)
00024
00025 {
00026 cerr << "Numerical Recipes run-time error..." << endl;
00027 cerr << error_text << endl;
00028 cerr << "...now exiting to system..." << endl;
00029 exit(1);
00030 }
00031 }
00032
00033 template <class T>
00034 class NRVec {
00035 private:
00036 int nn;
00037 T *v;
00038 public:
00039 NRVec();
00040 explicit NRVec(int n);
00041 NRVec(const T &a, int n);
00042 NRVec(const T *a, int n);
00043 NRVec(const NRVec &rhs);
00044 NRVec & operator=(const NRVec &rhs);
00045 NRVec & operator=(const T &a);
00046 inline T & operator[](const int i);
00047 inline const T & operator[](const int i) const;
00048 inline int size() const;
00049 ~NRVec();
00050 };
00051
00052 template <class T>
00053 NRVec<T>::NRVec() : nn(0), v(0) {}
00054
00055 template <class T>
00056 NRVec<T>::NRVec(int n) : nn(n), v(new T[n]) {}
00057
00058 template <class T>
00059 NRVec<T>::NRVec(const T& a, int n) : nn(n), v(new T[n])
00060 {
00061 for(int i=0; i<n; i++)
00062 v[i] = a;
00063 }
00064
00065 template <class T>
00066 NRVec<T>::NRVec(const T *a, int n) : nn(n), v(new T[n])
00067 {
00068 for(int i=0; i<n; i++)
00069 v[i] = *a++;
00070 }
00071
00072 template <class T>
00073 NRVec<T>::NRVec(const NRVec<T> &rhs) : nn(rhs.nn), v(new T[nn])
00074 {
00075 for(int i=0; i<nn; i++)
00076 v[i] = rhs[i];
00077 }
00078
00079 template <class T>
00080 NRVec<T> & NRVec<T>::operator=(const NRVec<T> &rhs)
00081
00082
00083
00084 {
00085 if (this != &rhs)
00086 {
00087 if (nn != rhs.nn) {
00088 if (v != 0) delete [] (v);
00089 nn=rhs.nn;
00090 v= new T[nn];
00091 }
00092 for (int i=0; i<nn; i++)
00093 v[i]=rhs[i];
00094 }
00095 return *this;
00096 }
00097
00098 template <class T>
00099 NRVec<T> & NRVec<T>::operator=(const T &a)
00100 {
00101 for (int i=0; i<nn; i++)
00102 v[i]=a;
00103 return *this;
00104 }
00105
00106 template <class T>
00107 inline T & NRVec<T>::operator[](const int i)
00108 {
00109 return v[i];
00110 }
00111
00112 template <class T>
00113 inline const T & NRVec<T>::operator[](const int i) const
00114 {
00115 return v[i];
00116 }
00117
00118 template <class T>
00119 inline int NRVec<T>::size() const
00120 {
00121 return nn;
00122 }
00123
00124 template <class T>
00125 NRVec<T>::~NRVec()
00126 {
00127 if (v != 0)
00128 delete[] (v);
00129 }
00130
00131 template <class T>
00132 class NRMat {
00133 private:
00134 int nn;
00135 int mm;
00136 T **v;
00137 public:
00138 NRMat();
00139 NRMat(int n, int m);
00140 NRMat(const T &a, int n, int m);
00141 NRMat(const T *a, int n, int m);
00142 NRMat(const NRMat &rhs);
00143 NRMat & operator=(const NRMat &rhs);
00144 NRMat & operator=(const T &a);
00145 inline T* operator[](const int i);
00146 inline const T* operator[](const int i) const;
00147 inline int nrows() const;
00148 inline int ncols() const;
00149 ~NRMat();
00150 };
00151
00152 template <class T>
00153 NRMat<T>::NRMat() : nn(0), mm(0), v(0) {}
00154
00155 template <class T>
00156 NRMat<T>::NRMat(int n, int m) : nn(n), mm(m), v(new T*[n])
00157 {
00158 v[0] = new T[m*n];
00159 for (int i=1; i< n; i++)
00160 v[i] = v[i-1] + m;
00161 }
00162
00163 template <class T>
00164 NRMat<T>::NRMat(const T &a, int n, int m) : nn(n), mm(m), v(new T*[n])
00165 {
00166 int i,j;
00167 v[0] = new T[m*n];
00168 for (i=1; i< n; i++)
00169 v[i] = v[i-1] + m;
00170 for (i=0; i< n; i++)
00171 for (j=0; j<m; j++)
00172 v[i][j] = a;
00173 }
00174
00175 template <class T>
00176 NRMat<T>::NRMat(const T *a, int n, int m) : nn(n), mm(m), v(new T*[n])
00177 {
00178 int i,j;
00179 v[0] = new T[m*n];
00180 for (i=1; i< n; i++)
00181 v[i] = v[i-1] + m;
00182 for (i=0; i< n; i++)
00183 for (j=0; j<m; j++)
00184 v[i][j] = *a++;
00185 }
00186
00187 template <class T>
00188 NRMat<T>::NRMat(const NRMat &rhs) : nn(rhs.nn), mm(rhs.mm), v(new T*[nn])
00189 {
00190 int i,j;
00191 v[0] = new T[mm*nn];
00192 for (i=1; i< nn; i++)
00193 v[i] = v[i-1] + mm;
00194 for (i=0; i< nn; i++)
00195 for (j=0; j<mm; j++)
00196 v[i][j] = rhs[i][j];
00197 }
00198
00199 template <class T>
00200 NRMat<T> & NRMat<T>::operator=(const NRMat<T> &rhs)
00201
00202
00203
00204 {
00205 if (this != &rhs) {
00206 int i,j;
00207 if (nn != rhs.nn || mm != rhs.mm) {
00208 if (v != 0) {
00209 delete[] (v[0]);
00210 delete[] (v);
00211 }
00212 nn=rhs.nn;
00213 mm=rhs.mm;
00214 v = new T*[nn];
00215 v[0] = new T[mm*nn];
00216 }
00217 for (i=1; i< nn; i++)
00218 v[i] = v[i-1] + mm;
00219 for (i=0; i< nn; i++)
00220 for (j=0; j<mm; j++)
00221 v[i][j] = rhs[i][j];
00222 }
00223 return *this;
00224 }
00225
00226 template <class T>
00227 NRMat<T> & NRMat<T>::operator=(const T &a)
00228 {
00229 for (int i=0; i< nn; i++)
00230 for (int j=0; j<mm; j++)
00231 v[i][j] = a;
00232 return *this;
00233 }
00234
00235 template <class T>
00236 inline T* NRMat<T>::operator[](const int i)
00237 {
00238 return v[i];
00239 }
00240
00241 template <class T>
00242 inline const T* NRMat<T>::operator[](const int i) const
00243 {
00244 return v[i];
00245 }
00246
00247 template <class T>
00248 inline int NRMat<T>::nrows() const
00249 {
00250 return nn;
00251 }
00252
00253 template <class T>
00254 inline int NRMat<T>::ncols() const
00255 {
00256 return mm;
00257 }
00258
00259 template <class T>
00260 NRMat<T>::~NRMat()
00261 {
00262 if (v != 0) {
00263 delete[] (v[0]);
00264 delete[] (v);
00265 }
00266 }
00267
00268 template <class T>
00269 class NRMat3d {
00270 private:
00271 int nn;
00272 int mm;
00273 int kk;
00274 T ***v;
00275 public:
00276 NRMat3d();
00277 NRMat3d(int n, int m, int k);
00278 inline T** operator[](const int i);
00279 inline const T* const * operator[](const int i) const;
00280 inline int dim1() const;
00281 inline int dim2() const;
00282 inline int dim3() const;
00283 ~NRMat3d();
00284 };
00285
00286 template <class T>
00287 NRMat3d<T>::NRMat3d(): nn(0), mm(0), kk(0), v(0) {}
00288
00289 template <class T>
00290 NRMat3d<T>::NRMat3d(int n, int m, int k) : nn(n), mm(m), kk(k), v(new T**[n])
00291 {
00292 int i,j;
00293 v[0] = new T*[n*m];
00294 v[0][0] = new T[n*m*k];
00295 for(j=1; j<m; j++)
00296 v[0][j] = v[0][j-1] + k;
00297 for(i=1; i<n; i++) {
00298 v[i] = v[i-1] + m;
00299 v[i][0] = v[i-1][0] + m*k;
00300 for(j=1; j<m; j++)
00301 v[i][j] = v[i][j-1] + k;
00302 }
00303 }
00304
00305 template <class T>
00306 inline T** NRMat3d<T>::operator[](const int i)
00307 {
00308 return v[i];
00309 }
00310
00311 template <class T>
00312 inline const T* const * NRMat3d<T>::operator[](const int i) const
00313 {
00314 return v[i];
00315 }
00316
00317 template <class T>
00318 inline int NRMat3d<T>::dim1() const
00319 {
00320 return nn;
00321 }
00322
00323 template <class T>
00324 inline int NRMat3d<T>::dim2() const
00325 {
00326 return mm;
00327 }
00328
00329 template <class T>
00330 inline int NRMat3d<T>::dim3() const
00331 {
00332 return kk;
00333 }
00334
00335 template <class T>
00336 NRMat3d<T>::~NRMat3d()
00337 {
00338 if (v != 0) {
00339 delete[] (v[0][0]);
00340 delete[] (v[0]);
00341 delete[] (v);
00342 }
00343 }
00344
00345
00346
00347
00348 class arithcode {
00349 private:
00350 NRVec<unsigned long> *ilob_p,*iupb_p,*ncumfq_p;
00351 public:
00352 NRVec<unsigned long> &ilob,&iupb,&ncumfq;
00353 unsigned long jdif,nc,minint,nch,ncum,nrad;
00354 arithcode(unsigned long n1, unsigned long n2, unsigned long n3)
00355 : ilob_p(new NRVec<unsigned long>(n1)),
00356 iupb_p(new NRVec<unsigned long>(n2)),
00357 ncumfq_p(new NRVec<unsigned long>(n3)),
00358 ilob(*ilob_p),iupb(*iupb_p),ncumfq(*ncumfq_p) {}
00359 ~arithcode() {
00360 if (ilob_p != 0) delete ilob_p;
00361 if (iupb_p != 0) delete iupb_p;
00362 if (ncumfq_p != 0) delete ncumfq_p;
00363 }
00364 };
00365
00366 class huffcode {
00367 private:
00368 NRVec<unsigned long> *icod_p,*ncod_p,*left_p,*right_p;
00369 public:
00370 NRVec<unsigned long> &icod,&ncod,&left,&right;
00371 int nch,nodemax;
00372 huffcode(unsigned long n1, unsigned long n2, unsigned long n3,
00373 unsigned long n4) :
00374 icod_p(new NRVec<unsigned long>(n1)),
00375 ncod_p(new NRVec<unsigned long>(n2)),
00376 left_p(new NRVec<unsigned long>(n3)),
00377 right_p(new NRVec<unsigned long>(n4)),
00378 icod(*icod_p),ncod(*ncod_p),left(*left_p),right(*right_p) {}
00379 ~huffcode() {
00380 if (icod_p != 0) delete icod_p;
00381 if (ncod_p != 0) delete ncod_p;
00382 if (left_p != 0) delete left_p;
00383 if (right_p != 0) delete right_p;
00384 }
00385 };
00386
00387 class wavefilt {
00388 private:
00389 NRVec<DP> *cc_p,*cr_p;
00390 public:
00391 int ncof,ioff,joff;
00392 NRVec<DP> &cc,&cr;
00393 wavefilt() : cc(*cc_p),cr(*cr_p) {}
00394 wavefilt(const DP *a, const int n) :
00395 cc_p(new NRVec<DP>(n)),cr_p(new NRVec<DP>(n)),
00396 ncof(n),ioff(-(n >> 1)),joff(-(n >> 1)),cc(*cc_p),cr(*cr_p) {
00397 int i;
00398 for (i=0; i<n; i++)
00399 cc[i] = *a++;
00400 DP sig = -1.0;
00401 for (i=0; i<n; i++) {
00402 cr[n-1-i]=sig*cc[i];
00403 sig = -sig;
00404 }
00405 }
00406 ~wavefilt() {
00407 if (cc_p != 0) delete cc_p;
00408 if (cr_p != 0) delete cr_p;
00409 }
00410 };
00411
00412
00413
00414
00415 inline const complex<float> operator+(const double &a,
00416 const complex<float> &b) { return float(a)+b; }
00417
00418 inline const complex<float> operator+(const complex<float> &a,
00419 const double &b) { return a+float(b); }
00420
00421 inline const complex<float> operator-(const double &a,
00422 const complex<float> &b) { return float(a)-b; }
00423
00424 inline const complex<float> operator-(const complex<float> &a,
00425 const double &b) { return a-float(b); }
00426
00427 inline const complex<float> operator*(const double &a,
00428 const complex<float> &b) { return float(a)*b; }
00429
00430 inline const complex<float> operator*(const complex<float> &a,
00431 const double &b) { return a*float(b); }
00432
00433 inline const complex<float> operator/(const double &a,
00434 const complex<float> &b) { return float(a)/b; }
00435
00436 inline const complex<float> operator/(const complex<float> &a,
00437 const double &b) { return a/float(b); }
00438
00439
00440
00441 inline float pow (float x, double y) {return pow(double(x),y);}
00442 inline float pow (double x, float y) {return pow(x,double(y));}
00443 inline float atan2 (float x, double y) {return atan2(double(x),y);}
00444 inline float atan2 (double x, float y) {return atan2(x,double(y));}
00445 #endif