Doxygen Source Code Documentation
rtest1.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | BBOT 10 |
#define | QS_CUTOFF 20 |
#define | QS_STACK 1024 |
#define | QS_SWAP(x, y) (temp=(x), (x)=(y),(y)=temp ) |
#define | QS_SWAPI(x, y) (itemp=(x),(x)=(y),(y)=itemp) |
Functions | |
void | qsort_double (int n, double *a) |
void | gaussians (int n, double *g) |
void | normalize_doublevector (int n, double *far) |
double | rtest (int msam, int nvec, double *lamq, double *rho) |
int | main (int argc, char *argv[]) |
void | isort_double (int n, double *ar) |
void | qsrec_double (int n, double *ar, int cutoff) |
Variables | |
int | stack [QS_STACK] |
Define Documentation
|
Definition at line 52 of file rtest1.c. Referenced by main(). |
|
Definition at line 170 of file rtest1.c. Referenced by qsort_double(). |
|
|
|
|
|
|
Function Documentation
|
Definition at line 14 of file rtest1.c. Referenced by main().
00015 { 00016 double u1,u2 ; 00017 int ii ; 00018 00019 for( ii=0 ; ii < n ; ii+=2 ){ 00020 do{ u1 = drand48() ; } while( u1==0.0 ) ; 00021 u1 = sqrt(-2.0*log(u1)) ; 00022 u2 = 6.2831853 * drand48() ; 00023 g[ii] = u1 * sin(u2) ; 00024 if( ii < n-1 ) g[ii+1] = u1 * cos(u2) ; 00025 } 00026 return ; 00027 } |
|
Definition at line 147 of file rtest1.c. Referenced by qsort_double().
00148 { 00149 register int j , p ; /* array indices */ 00150 register double temp ; /* a[j] holding place */ 00151 register double * a = ar ; 00152 00153 if( n < 2 || ar == NULL ) return ; 00154 00155 for( j=1 ; j < n ; j++ ){ 00156 00157 if( a[j] < a[j-1] ){ /* out of order */ 00158 p = j ; 00159 temp = a[j] ; 00160 do{ 00161 a[p] = a[p-1] ; /* at this point, a[p-1] > temp, so move it up */ 00162 p-- ; 00163 } while( p > 0 && temp < a[p-1] ) ; 00164 a[p] = temp ; /* finally, put temp in its place */ 00165 } 00166 } 00167 return ; 00168 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 54 of file rtest1.c. References argc, BBOT, free, gaussians(), malloc, normalize_doublevector(), qginv(), qsort_double(), and strtod().
00055 { 00056 int nopt , mdev , jsize , ii,jj , numj,jset[100] ; 00057 double * gset , * pset , * rr ; 00058 double pp , dm ; 00059 00060 srand48((long)time(NULL)) ; /* initialize randomness */ 00061 00062 /* read command line */ 00063 00064 if( argc < 3 || strcmp(argv[1],"-help") == 0 ){ 00065 printf("Usage: rtest1 M J [j1 j2 j3 ...]\n" 00066 " M = # of deviates per sample sets\n" 00067 " J = # of sample sets to generate\n" 00068 " j1 = first statistic to output, etc.\n" 00069 ) ; 00070 exit(0) ; 00071 } 00072 00073 nopt = 1 ; 00074 mdev = (int) strtod(argv[nopt++],NULL) ; 00075 if( mdev < BBOT ){ fprintf(stderr,"M=%d is too small!\n",mdev); exit(1); } 00076 jsize = (int) strtod(argv[nopt++],NULL) ; 00077 if( jsize < BBOT ){ fprintf(stderr,"J=%d is too small!\n",jsize); exit(1); } 00078 00079 for( numj=0 ; numj < 100 && nopt < argc ; ){ 00080 ii = (int) strtod(argv[nopt++],NULL) ; 00081 if( ii < 0 || ii >= jsize ) 00082 fprintf(stderr,"** j%d = %d is illegal!\n",nopt-2,ii) ; 00083 else 00084 jset[numj++] = ii ; 00085 } 00086 00087 /* make space for sample sets and results */ 00088 00089 gset = (double *) malloc(sizeof(double)*mdev) ; /* 1 sample set */ 00090 pset = (double *) malloc(sizeof(double)*mdev) ; /* cdf-inverses */ 00091 rr = (double *) malloc(sizeof(double)*jsize) ; /* results */ 00092 00093 /* initialize pset to quantile points on the N(0,1) cdf */ 00094 00095 dm = 1.0 / (double) mdev ; 00096 for( ii=0 ; ii < mdev ; ii++ ){ 00097 pp = dm * (ii+0.5) ; pset[ii] = qginv( 1.0 - pp ) ; 00098 } 00099 normalize_doublevector( mdev , pset ) ; /* prepare for correlation */ 00100 00101 /* loop over realization of sample sets */ 00102 00103 for( jj=0 ; jj < jsize ; jj++ ){ 00104 gaussians( mdev , gset ) ; /* make a sample set */ 00105 qsort_double( mdev , gset ) ; /* sort it */ 00106 normalize_doublevector( mdev , gset ) ; /* prepare for correlation */ 00107 for( pp=0.0,ii=0 ; ii < mdev ; ii++ ) /* compute 1.0-correlation */ 00108 pp += dm - gset[ii]*pset[ii] ; 00109 rr[jj] = -pp ; /* save it (or minus it) */ 00110 00111 if( jj > 0 && jj%10000 == 0 ) fprintf(stderr,"at #%d rr=%g\n",jj,pp) ; 00112 } 00113 00114 free(gset) ; free(pset) ; /* toss some trash */ 00115 00116 /* sort results */ 00117 00118 qsort_double( jsize , rr ) ; 00119 for( jj=0 ; jj < jsize ; jj++ ) rr[jj] = -rr[jj] ; /* back to 1-corr */ 00120 00121 /* print results */ 00122 00123 if( numj > 0 ){ 00124 dm = 1.0 / jsize ; 00125 for( jj=0 ; jj < numj ; jj++ ) 00126 printf(" %.4f %g\n", dm*(jset[jj]+1.0) , rr[jset[jj]] ) ; 00127 } else { 00128 for( jj=0 ; jj < jsize ; jj++ ) printf(" %g",rr[jj]) ; 00129 printf("\n"); 00130 } 00131 00132 exit(0) ; 00133 } |
|
Definition at line 33 of file rtest1.c. Referenced by main().
00034 { 00035 int ii ; 00036 double ff,gg ; 00037 00038 for( ff=0.0,ii=0 ; ii < n ; ii++ ) ff += far[ii] ; 00039 ff /= n ; 00040 for( gg=0.0,ii=0 ; ii < n ; ii++ ) gg += SQR( (far[ii]-ff) ) ; 00041 if( gg <= 0.0 ) return ; 00042 gg = 1.0 / sqrt(gg) ; 00043 for( ii=0 ; ii < n ; ii++ ) far[ii] = (far[ii]-ff)*gg ; 00044 00045 return ; 00046 } |
|
Definition at line 252 of file rtest1.c. References a, isort_double(), QS_CUTOFF, and qsrec_double(). Referenced by main().
00253 { 00254 qsrec_double( n , a , QS_CUTOFF ) ; 00255 isort_double( n , a ) ; 00256 return ; 00257 } |
|
Definition at line 179 of file rtest1.c. References a, i, left, QS_SWAP, QS_SWAPI, right, and stack. Referenced by qsort_double().
00180 { 00181 register int i , j ; /* scanning indices */ 00182 register double temp , pivot ; /* holding places */ 00183 register double * a = ar ; 00184 00185 int left , right , mst , itemp,nnew ; 00186 00187 /* return if too short (insertion sort will clean up) */ 00188 00189 if( cutoff < 3 ) cutoff = 3 ; 00190 if( n < cutoff || ar == NULL ) return ; 00191 00192 /* initialize stack to start with whole array */ 00193 00194 stack[0] = 0 ; 00195 stack[1] = n-1 ; 00196 mst = 2 ; 00197 00198 /* loop while the stack is nonempty */ 00199 00200 while( mst > 0 ){ 00201 right = stack[--mst] ; /* work on subarray from left -> right */ 00202 left = stack[--mst] ; 00203 00204 i = ( left + right ) / 2 ; /* middle of subarray */ 00205 00206 /*----- sort the left, middle, and right a[]'s -----*/ 00207 00208 if( a[left] > a[i] ) QS_SWAP( a[left] , a[i] ) ; 00209 if( a[left] > a[right] ) QS_SWAP( a[left] , a[right] ) ; 00210 if( a[i] > a[right] ) QS_SWAP( a[right] , a[i] ) ; 00211 00212 pivot = a[i] ; /* a[i] is the median-of-3 pivot! */ 00213 a[i] = a[right] ; 00214 00215 i = left ; j = right ; /* initialize scanning */ 00216 00217 /*----- partition: move elements bigger than pivot up and elements 00218 smaller than pivot down, scanning in from ends -----*/ 00219 00220 do{ 00221 for( ; a[++i] < pivot ; ) ; /* scan i up, until a[i] >= pivot */ 00222 for( ; a[--j] > pivot ; ) ; /* scan j down, until a[j] <= pivot */ 00223 00224 if( j <= i ) break ; /* if j meets i, quit */ 00225 00226 QS_SWAP( a[i] , a[j] ) ; 00227 } while( 1 ) ; 00228 00229 /*----- at this point, the array is partitioned -----*/ 00230 00231 a[right] = a[i] ; a[i] = pivot ; /* restore the pivot */ 00232 00233 /*----- signal the subarrays that need further work -----*/ 00234 00235 nnew = 0 ; 00236 if( (i-left) > cutoff ){ stack[mst++] = left; stack[mst++] = i-1 ; nnew++; } 00237 if( (right-i) > cutoff ){ stack[mst++] = i+1 ; stack[mst++] = right; nnew++; } 00238 00239 /* if just added two subarrays to stack, make sure shorter one comes first */ 00240 00241 if( nnew == 2 && stack[mst-3] - stack[mst-4] > stack[mst-1] - stack[mst-2] ){ 00242 QS_SWAPI( stack[mst-4] , stack[mst-2] ) ; 00243 QS_SWAPI( stack[mst-3] , stack[mst-1] ) ; 00244 } 00245 00246 } /* end of while stack is non-empty */ 00247 return ; 00248 } |
|
Definition at line 135 of file rtest1.c. References malloc.
|
Variable Documentation
|
Definition at line 175 of file rtest1.c. Referenced by qsrec_double(). |