nrutil_nr.h
Go to the documentation of this file.
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         // Numerical Recipes standard error handler
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; // size of array. upper index is nn-1
00037         T *v;
00038 public:
00039         NRVec();
00040         explicit NRVec(int n);          // Zero-based array
00041         NRVec(const T &a, int n);       //initialize to constant value
00042         NRVec(const T *a, int n);       // Initialize to array
00043         NRVec(const NRVec &rhs);        // Copy constructor
00044         NRVec & operator=(const NRVec &rhs);    //assignment
00045         NRVec & operator=(const T &a);  //assign a to every element
00046         inline T & operator[](const int i);     //i'th element
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 // postcondition: normal assignment via copying has been performed;
00082 //              if vector and rhs were different sizes, vector
00083 //              has been resized to match the size of rhs
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)      //assign a to every element
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)    //subscripting
00108 {
00109         return v[i];
00110 }
00111 
00112 template <class T>
00113 inline const T & NRVec<T>::operator[](const int i) const        //subscripting
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);                    // Zero-based array
00140         NRMat(const T &a, int n, int m);        //Initialize to constant
00141         NRMat(const T *a, int n, int m);        // Initialize to array
00142         NRMat(const NRMat &rhs);                // Copy constructor
00143         NRMat & operator=(const NRMat &rhs);    //assignment
00144         NRMat & operator=(const T &a);          //assign a to every element
00145         inline T* operator[](const int i);      //subscripting: pointer to row 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 // postcondition: normal assignment via copying has been performed;
00202 //              if matrix and rhs were different sizes, matrix
00203 //              has been resized to match the size of rhs
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)      //assign a to every element
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)     //subscripting: pointer to row 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);     //subscripting: pointer to row 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) //subscripting: pointer to row 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 //The next 3 classes are used in artihmetic coding, Huffman coding, and
00346 //wavelet transforms respectively. This is as good a place as any to put them!
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) :  //initialize to array
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 //Overloaded complex operations to handle mixed float and double
00413 //This takes care of e.g. 1.0/z, z complex<float>
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 //some compilers choke on pow(float,double) in single precision. also atan2
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 /* _NR_UTIL_H_ */


tensor_field_nav_core
Author(s): Lintao Zheng, Kai Xu
autogenerated on Thu Jun 6 2019 19:50:56