annotate toolboxes/FullBNT-1.0.7/bnt/inference/static/@quickscore_inf_engine/private/nrutil.c @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
wolffd@0 1 /* CAUTION: This is the ANSI C (only) version of the Numerical Recipes
wolffd@0 2 utility file nrutil.c. Do not confuse this file with the same-named
wolffd@0 3 file nrutil.c that is supplied in the 'misc' subdirectory.
wolffd@0 4 *That* file is the one from the book, and contains both ANSI and
wolffd@0 5 traditional K&R versions, along with #ifdef macros to select the
wolffd@0 6 correct version. *This* file contains only ANSI C. */
wolffd@0 7
wolffd@0 8 #include <stdio.h>
wolffd@0 9 #include <stddef.h>
wolffd@0 10 #include <stdlib.h>
wolffd@0 11 #define NR_END 1
wolffd@0 12 #define FREE_ARG char*
wolffd@0 13
wolffd@0 14 void nrerror(char error_text[])
wolffd@0 15 /* Numerical Recipes standard error handler */
wolffd@0 16 {
wolffd@0 17 fprintf(stderr,"Numerical Recipes run-time error...\n");
wolffd@0 18 fprintf(stderr,"%s\n",error_text);
wolffd@0 19 fprintf(stderr,"...now exiting to system...\n");
wolffd@0 20 exit(1);
wolffd@0 21 }
wolffd@0 22
wolffd@0 23 float *vector(long nl, long nh)
wolffd@0 24 /* allocate a float vector with subscript range v[nl..nh] */
wolffd@0 25 {
wolffd@0 26 float *v;
wolffd@0 27
wolffd@0 28 v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
wolffd@0 29 if (!v) nrerror("allocation failure in vector()");
wolffd@0 30 return v-nl+NR_END;
wolffd@0 31 }
wolffd@0 32
wolffd@0 33 int *ivector(long nl, long nh)
wolffd@0 34 /* allocate an int vector with subscript range v[nl..nh] */
wolffd@0 35 {
wolffd@0 36 int *v;
wolffd@0 37
wolffd@0 38 v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int)));
wolffd@0 39 if (!v) nrerror("allocation failure in ivector()");
wolffd@0 40 return v-nl+NR_END;
wolffd@0 41 }
wolffd@0 42
wolffd@0 43 unsigned char *cvector(long nl, long nh)
wolffd@0 44 /* allocate an unsigned char vector with subscript range v[nl..nh] */
wolffd@0 45 {
wolffd@0 46 unsigned char *v;
wolffd@0 47
wolffd@0 48 v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
wolffd@0 49 if (!v) nrerror("allocation failure in cvector()");
wolffd@0 50 return v-nl+NR_END;
wolffd@0 51 }
wolffd@0 52
wolffd@0 53 unsigned long *lvector(long nl, long nh)
wolffd@0 54 /* allocate an unsigned long vector with subscript range v[nl..nh] */
wolffd@0 55 {
wolffd@0 56 unsigned long *v;
wolffd@0 57
wolffd@0 58 v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long)));
wolffd@0 59 if (!v) nrerror("allocation failure in lvector()");
wolffd@0 60 return v-nl+NR_END;
wolffd@0 61 }
wolffd@0 62
wolffd@0 63 double *dvector(long nl, long nh)
wolffd@0 64 /* allocate a double vector with subscript range v[nl..nh] */
wolffd@0 65 {
wolffd@0 66 double *v;
wolffd@0 67
wolffd@0 68 v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
wolffd@0 69 if (!v) nrerror("allocation failure in dvector()");
wolffd@0 70 return v-nl+NR_END;
wolffd@0 71 }
wolffd@0 72
wolffd@0 73 float **matrix(long nrl, long nrh, long ncl, long nch)
wolffd@0 74 /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
wolffd@0 75 {
wolffd@0 76 long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
wolffd@0 77 float **m;
wolffd@0 78
wolffd@0 79 /* allocate pointers to rows */
wolffd@0 80 m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
wolffd@0 81 if (!m) nrerror("allocation failure 1 in matrix()");
wolffd@0 82 m += NR_END;
wolffd@0 83 m -= nrl;
wolffd@0 84
wolffd@0 85 /* allocate rows and set pointers to them */
wolffd@0 86 m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
wolffd@0 87 if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
wolffd@0 88 m[nrl] += NR_END;
wolffd@0 89 m[nrl] -= ncl;
wolffd@0 90
wolffd@0 91 for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
wolffd@0 92
wolffd@0 93 /* return pointer to array of pointers to rows */
wolffd@0 94 return m;
wolffd@0 95 }
wolffd@0 96
wolffd@0 97 double **dmatrix(long nrl, long nrh, long ncl, long nch)
wolffd@0 98 /* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
wolffd@0 99 {
wolffd@0 100 long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
wolffd@0 101 double **m;
wolffd@0 102
wolffd@0 103 /* allocate pointers to rows */
wolffd@0 104 m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
wolffd@0 105 if (!m) nrerror("allocation failure 1 in matrix()");
wolffd@0 106 m += NR_END;
wolffd@0 107 m -= nrl;
wolffd@0 108
wolffd@0 109 /* allocate rows and set pointers to them */
wolffd@0 110 m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
wolffd@0 111 if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
wolffd@0 112 m[nrl] += NR_END;
wolffd@0 113 m[nrl] -= ncl;
wolffd@0 114
wolffd@0 115 for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
wolffd@0 116
wolffd@0 117 /* return pointer to array of pointers to rows */
wolffd@0 118 return m;
wolffd@0 119 }
wolffd@0 120
wolffd@0 121 int **imatrix(long nrl, long nrh, long ncl, long nch)
wolffd@0 122 /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
wolffd@0 123 {
wolffd@0 124 long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
wolffd@0 125 int **m;
wolffd@0 126
wolffd@0 127 /* allocate pointers to rows */
wolffd@0 128 m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
wolffd@0 129 if (!m) nrerror("allocation failure 1 in matrix()");
wolffd@0 130 m += NR_END;
wolffd@0 131 m -= nrl;
wolffd@0 132
wolffd@0 133
wolffd@0 134 /* allocate rows and set pointers to them */
wolffd@0 135 m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
wolffd@0 136 if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
wolffd@0 137 m[nrl] += NR_END;
wolffd@0 138 m[nrl] -= ncl;
wolffd@0 139
wolffd@0 140 for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
wolffd@0 141
wolffd@0 142 /* return pointer to array of pointers to rows */
wolffd@0 143 return m;
wolffd@0 144 }
wolffd@0 145
wolffd@0 146 float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
wolffd@0 147 long newrl, long newcl)
wolffd@0 148 /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
wolffd@0 149 {
wolffd@0 150 long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
wolffd@0 151 float **m;
wolffd@0 152
wolffd@0 153 /* allocate array of pointers to rows */
wolffd@0 154 m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
wolffd@0 155 if (!m) nrerror("allocation failure in submatrix()");
wolffd@0 156 m += NR_END;
wolffd@0 157 m -= newrl;
wolffd@0 158
wolffd@0 159 /* set pointers to rows */
wolffd@0 160 for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
wolffd@0 161
wolffd@0 162 /* return pointer to array of pointers to rows */
wolffd@0 163 return m;
wolffd@0 164 }
wolffd@0 165
wolffd@0 166 float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
wolffd@0 167 /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
wolffd@0 168 declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
wolffd@0 169 and ncol=nch-ncl+1. The routine should be called with the address
wolffd@0 170 &a[0][0] as the first argument. */
wolffd@0 171 {
wolffd@0 172 long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
wolffd@0 173 float **m;
wolffd@0 174
wolffd@0 175 /* allocate pointers to rows */
wolffd@0 176 m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
wolffd@0 177 if (!m) nrerror("allocation failure in convert_matrix()");
wolffd@0 178 m += NR_END;
wolffd@0 179 m -= nrl;
wolffd@0 180
wolffd@0 181 /* set pointers to rows */
wolffd@0 182 m[nrl]=a-ncl;
wolffd@0 183 for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
wolffd@0 184 /* return pointer to array of pointers to rows */
wolffd@0 185 return m;
wolffd@0 186 }
wolffd@0 187
wolffd@0 188 double **convert_dmatrix(double *a, long nrl, long nrh, long ncl, long nch)
wolffd@0 189 /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
wolffd@0 190 declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
wolffd@0 191 and ncol=nch-ncl+1. The routine should be called with the address
wolffd@0 192 &a[0][0] as the first argument. */
wolffd@0 193 {
wolffd@0 194 long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
wolffd@0 195 double **m;
wolffd@0 196
wolffd@0 197 /* allocate pointers to rows */
wolffd@0 198 m=(double **) malloc((size_t) ((nrow+NR_END)*sizeof(double*)));
wolffd@0 199 if (!m) nrerror("allocation failure in convert_dmatrix()");
wolffd@0 200 m += NR_END;
wolffd@0 201 m -= nrl;
wolffd@0 202
wolffd@0 203 /* set pointers to rows */
wolffd@0 204 m[nrl]=a-ncl;
wolffd@0 205 for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
wolffd@0 206 /* return pointer to array of pointers to rows */
wolffd@0 207 return m;
wolffd@0 208 }
wolffd@0 209
wolffd@0 210 float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
wolffd@0 211 /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
wolffd@0 212 {
wolffd@0 213 long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
wolffd@0 214 float ***t;
wolffd@0 215
wolffd@0 216 /* allocate pointers to pointers to rows */
wolffd@0 217 t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**)));
wolffd@0 218 if (!t) nrerror("allocation failure 1 in f3tensor()");
wolffd@0 219 t += NR_END;
wolffd@0 220 t -= nrl;
wolffd@0 221
wolffd@0 222 /* allocate pointers to rows and set pointers to them */
wolffd@0 223 t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*)));
wolffd@0 224 if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
wolffd@0 225 t[nrl] += NR_END;
wolffd@0 226 t[nrl] -= ncl;
wolffd@0 227
wolffd@0 228 /* allocate rows and set pointers to them */
wolffd@0 229 t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float)));
wolffd@0 230 if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
wolffd@0 231 t[nrl][ncl] += NR_END;
wolffd@0 232 t[nrl][ncl] -= ndl;
wolffd@0 233
wolffd@0 234 for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
wolffd@0 235 for(i=nrl+1;i<=nrh;i++) {
wolffd@0 236 t[i]=t[i-1]+ncol;
wolffd@0 237 t[i][ncl]=t[i-1][ncl]+ncol*ndep;
wolffd@0 238 for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
wolffd@0 239 }
wolffd@0 240
wolffd@0 241 /* return pointer to array of pointers to rows */
wolffd@0 242 return t;
wolffd@0 243 }
wolffd@0 244
wolffd@0 245 void free_vector(float *v, long nl, long nh)
wolffd@0 246 /* free a float vector allocated with vector() */
wolffd@0 247 {
wolffd@0 248 free((FREE_ARG) (v+nl-NR_END));
wolffd@0 249 }
wolffd@0 250
wolffd@0 251 void free_ivector(int *v, long nl, long nh)
wolffd@0 252 /* free an int vector allocated with ivector() */
wolffd@0 253 {
wolffd@0 254 free((FREE_ARG) (v+nl-NR_END));
wolffd@0 255 }
wolffd@0 256
wolffd@0 257 void free_cvector(unsigned char *v, long nl, long nh)
wolffd@0 258 /* free an unsigned char vector allocated with cvector() */
wolffd@0 259 {
wolffd@0 260 free((FREE_ARG) (v+nl-NR_END));
wolffd@0 261 }
wolffd@0 262
wolffd@0 263 void free_lvector(unsigned long *v, long nl, long nh)
wolffd@0 264 /* free an unsigned long vector allocated with lvector() */
wolffd@0 265 {
wolffd@0 266 free((FREE_ARG) (v+nl-NR_END));
wolffd@0 267 }
wolffd@0 268
wolffd@0 269 void free_dvector(double *v, long nl, long nh)
wolffd@0 270 /* free a double vector allocated with dvector() */
wolffd@0 271 {
wolffd@0 272 free((FREE_ARG) (v+nl-NR_END));
wolffd@0 273 }
wolffd@0 274
wolffd@0 275 void free_matrix(float **m, long nrl, long nrh, long ncl, long nch)
wolffd@0 276 /* free a float matrix allocated by matrix() */
wolffd@0 277 {
wolffd@0 278 free((FREE_ARG) (m[nrl]+ncl-NR_END));
wolffd@0 279 free((FREE_ARG) (m+nrl-NR_END));
wolffd@0 280 }
wolffd@0 281
wolffd@0 282 void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
wolffd@0 283 /* free a double matrix allocated by dmatrix() */
wolffd@0 284 {
wolffd@0 285 free((FREE_ARG) (m[nrl]+ncl-NR_END));
wolffd@0 286 free((FREE_ARG) (m+nrl-NR_END));
wolffd@0 287 }
wolffd@0 288
wolffd@0 289 void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch)
wolffd@0 290 /* free an int matrix allocated by imatrix() */
wolffd@0 291 {
wolffd@0 292 free((FREE_ARG) (m[nrl]+ncl-NR_END));
wolffd@0 293 free((FREE_ARG) (m+nrl-NR_END));
wolffd@0 294 }
wolffd@0 295
wolffd@0 296 void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch)
wolffd@0 297 /* free a submatrix allocated by submatrix() */
wolffd@0 298 {
wolffd@0 299 free((FREE_ARG) (b+nrl-NR_END));
wolffd@0 300 }
wolffd@0 301
wolffd@0 302 void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch)
wolffd@0 303 /* free a matrix allocated by convert_matrix() */
wolffd@0 304 {
wolffd@0 305 free((FREE_ARG) (b+nrl-NR_END));
wolffd@0 306 }
wolffd@0 307
wolffd@0 308 void free_convert_dmatrix(double **b, long nrl, long nrh, long ncl, long nch)
wolffd@0 309 /* free a matrix allocated by convert_matrix() */
wolffd@0 310 {
wolffd@0 311 free((FREE_ARG) (b+nrl-NR_END));
wolffd@0 312 }
wolffd@0 313
wolffd@0 314 void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
wolffd@0 315 long ndl, long ndh)
wolffd@0 316 /* free a float f3tensor allocated by f3tensor() */
wolffd@0 317 {
wolffd@0 318 free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END));
wolffd@0 319 free((FREE_ARG) (t[nrl]+ncl-NR_END));
wolffd@0 320 free((FREE_ARG) (t+nrl-NR_END));
wolffd@0 321 }