utils.cc
上传用户:l56789
上传日期:2022-02-25
资源大小:2422k
文件大小:2k
源码类别:

图形图像处理

开发平台:

Matlab

  1. //-----------------------------------------------------------------------------
  2. // utils.cc
  3. //-----------------------------------------------------------------------------
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include "utils.hh"
  8. /*---------------------------------------------------------------------------*/
  9. int ipow(int n, int j)
  10. {
  11.     register int i, res;
  12.   
  13.     res = 1;
  14.     for (i = 0; i < j; i++)
  15. res *= n;
  16.     return res;
  17. }
  18. /*-----------------------------------------------------------------------*/
  19. // For random generator (Numerical Recipe book)
  20. #define IA 16807
  21. #define IM 2147483647
  22. #define AM (1.0/IM)
  23. #define IQ 127773
  24. #define IR 2836
  25. #define NTAB 32
  26. #define NDIV (1+(IM-1)/NTAB)
  27. #define EPS 1.2e-7
  28. #define RNMX (1.0-EPS)
  29. double ran1(int& idum)
  30. {
  31.     int j;
  32.     int k;
  33.     static int iy=0;
  34.     static int iv[NTAB];
  35.     double temp;
  36.     if (idum <= 0 || !iy) {
  37. if (-(idum) < 1) idum=1;
  38. else idum = -(idum);
  39. for (j=NTAB+7;j>=0;j--) {
  40.     k=(idum)/IQ;
  41.     idum=IA*(idum-k*IQ)-IR*k;
  42.     if (idum < 0) idum += IM;
  43.     if (j < NTAB) iv[j] = idum;
  44. }
  45. iy=iv[0];
  46.     }
  47.     k=(idum)/IQ;
  48.     idum=IA*(idum-k*IQ)-IR*k;
  49.     if (idum < 0) idum += IM;
  50.     j=iy/NDIV;
  51.     iy=iv[j];
  52.     iv[j] = idum;
  53.     if ((temp=AM*iy) > RNMX) return RNMX;
  54.     else return temp;
  55. }
  56. /*-----------------------------------------------------------------------*/
  57. double rangas(int& idum)
  58. {
  59.     static int iset=0;
  60.     static double gset;
  61.     double fac,rsq,v1,v2;
  62.     if  (iset == 0) {
  63. do {
  64.     v1=2.0*ran1(idum)-1.0;
  65.     v2=2.0*ran1(idum)-1.0;
  66.     rsq=v1*v1+v2*v2;
  67. } while (rsq >= 1.0 || rsq == 0.0);
  68. fac=sqrt(-2.0*log(rsq)/rsq);
  69. gset=v1*fac;
  70. iset=1;
  71. return v2*fac;
  72.     } else {
  73. iset=0;
  74. return gset;
  75.     }
  76. }
  77. /*---------------------------------------------------------------------------*/
  78. void ranprobs(vector<double>& v, int& idum)
  79. {
  80.     register double sum = 0.0;
  81.     register int i, size = v.size();
  82.     for (i = 0; i < size; i++) {
  83. v[i] = ran1(idum);
  84. sum += v[i];
  85.     }
  86.     // Normalize so add to one
  87.     for (i = 0; i < size; i++)
  88. v[i] = v[i] / sum;
  89. }
  90. /*---------------------------------------------------------------------------*/
  91. int ranind(const vector<double>& vprob, int& idum)
  92. {
  93.     register int k = 0;
  94.     register double cum = 0.0;
  95.     register double rn = ran1(idum);
  96.     while (cum < rn)
  97. cum += vprob[k++];
  98.     return (k-1);
  99. }