void getmaxRowCol (gsl_matrix * m, gsl_vector * max_row, gsl_vector * max_col) { unsigned int s1 = m->size1; unsigned int s2 = m->size2; double max = 0.; unsigned int i_max = 0; unsigned int j_max = 0; findpeak (m, &i_max, &j_max, &max); max_row = gsl_vector_alloc (s2); for (unsigned int j = 0; j < s2; j++) { gsl_vector_set (max_row, j, gsl_matrix_get (m, i_max, j)); } max_col = gsl_vector_alloc (s1); for (unsigned int i = 0; i < s1; i++) { gsl_vector_set (max_col, i, gsl_matrix_get (m, i, j_max)); } return; }
float bingdev(float *xbin, float *ybin, unsigned int nbin, long *idnum) { int i; int bin,peak,wing; float firstdev,seconddev,fx,x; float stddev,F; int findbin(float x, float *xbin, unsigned int nbin); int findpeak(float *ybin, unsigned int nbin); /* set the gaussian parameters so that f(x) is larger than ybin */ peak=findpeak(ybin,nbin); wing = ( (peak < nbin/2) ? nbin-1: 0 ); stddev = sqrt( 0.5*pow((xbin[wing]-xbin[peak]),2)/log(ybin[peak]/ybin[wing]) ); F = 1.25*ybin[peak]*stddev*SQRT2PI; do { /* First deviate - Gaussian */ firstdev = gasdev(idnum); x = firstdev *stddev + xbin[peak]; fx = 1./(stddev*SQRT2PI) * exp( -0.5*pow(firstdev,2) ); fx *= F; /* Second deviate between 0 and fx - reject if not under ybin */ if ( (bin = findbin(x,xbin,nbin)) > 0 ) { /*within range; proceed*/ seconddev = fx * ran1(idnum); } } while ((seconddev > ybin[bin]) || (bin<0)); return x; }