00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "mathadd.h"
00021 #include <stdlib.h>
00022 #include <math.h>
00023 #include <time.h>
00024 #include <gsl/gsl_sort.h>
00025 #include <gsl/gsl_statistics.h>
00026
00033 double weighted_median_from_unsorted(const double *d, const double *w, int n){
00034 size_t *permut;
00035 double ref=0.0, refh;
00036 int k;
00037 int i, h, idx;
00038
00039 permut=(size_t*)malloc(n*sizeof(size_t));
00040 gsl_sort_index(permut, d, 1, n);
00041
00042
00043
00044
00045
00046 for(i=0; i<n; i++)
00047 ref+=w[i];
00048 ref /= 2.0;
00049
00050 k=0;
00051 for(h=n-1; h>0; h--){
00052 refh = 0.0;
00053 for(i=h; i<n; i++){
00054 refh += w[permut[i]];
00055 }
00056 if(refh>=ref){
00057 k=h;
00058 break;
00059 }
00060 }
00061 idx = permut[k];
00062 free(permut);
00063 return d[idx];
00064 }
00065
00066
00067
00068
00069
00074 double rmse(const double *r, const double *d, int n){
00075 int i;
00076 double res=0.0;
00077 for(i=0; i<n; i++)
00078 res = res + pow(r[i]-d[i], 2);
00079 return sqrt(res*1/n);
00080 }
00081
00085 double snr (const double *r, const double *d, int n){
00086 int i;
00087 double res, tmp;
00088 res = 0.0; tmp = 0.0;
00089 for(i=0; i<n; i++){
00090 res = res+pow(r[i], 2);
00091 tmp = tmp+pow(r[i]-d[i], 2);
00092 }
00093 return 10*(glog(res/tmp, 10));
00094 }
00095
00105 int cmpdouble(double d1, double d2, int precision){
00106 double epsilon;
00107 epsilon = pow(10, -1*precision);
00108 if(fabs(d1 - d2) < epsilon*fabs(d1) ){
00109 return 0;
00110 } else if(d1<d2){
00111 return -1;
00112 } else {
00113 return 1;
00114 }
00115 }
00116 double glog(double v, int b){
00117
00118 return (double)((double)log((double)v)/(double)log((double)b));
00119 }
00120
00121 double mad(const double *data, int n){
00122
00123
00124
00125
00126 double *tmp;
00127 double med;
00128 int i;
00129 tmp = (double*)malloc(n*sizeof(double));
00130 tmp = (double*)memcpy((void*)tmp, (const void*)data, sizeof(double)*n);
00131
00132 gsl_sort(tmp, 1, n);
00133 med = gsl_stats_median_from_sorted_data(tmp, 1, n);
00134 for(i=0; i<n; i++)
00135 tmp[i] = fabs(data[i]-med);
00136 gsl_sort(tmp, 1, n);
00137 med = gsl_stats_median_from_sorted_data(tmp, 1, n);
00138
00139 free(tmp);
00140 return med;
00141 }
00142
00143
00144 int abscmp(const void *p1, const void *p2){
00145 if(fabs(*(double*)p1)<fabs(*(double*)p2))
00146 return -1;
00147 else if(fabs(*(double*)p1)>fabs(*(double*)p2))
00148 return 1;
00149 else
00150 return 0;
00151 }
00152
00153 double vnorm(const double *v, int n, int p){
00154
00155 int i;
00156 double norm = 0;
00157 for(i=0; i<n; i++)
00158 norm = norm + pow(fabs(v[i]), p);
00159 return pow(norm, 1/(double)p);
00160 }
00161
00162
00163 double maxel(double *v, int n){
00164 int i;
00165 double m=DBL_MIN;
00166 for(i=0; i<n; i++)
00167 if(v[i]>m) m=v[i];
00168 return m;
00169 }
00170
00171 int maxeli(int *v, int n){
00172 int i;
00173 int m=INT_MIN;
00174 for(i=0; i<n; i++)
00175 if(v[i]<m) m=v[i];
00176 return m;
00177 }
00178
00185 int closest_index(const double *v, int n, double c){
00186 int i, index=-1;
00187 double tmp=DBL_MAX;
00188
00189 for(i=0; i<n; i++){
00190 if(fabs(v[i]-c) < tmp){
00191 index=i;
00192 tmp = fabs(v[i]-c);
00193 }
00194 }
00195 return index;
00196 }
00197
00198 double* sampled_line(double *ntimes, int n, double start, double end){
00199
00200
00201 double step;
00202 int i;
00203
00204 step=(end-start)/(double)(n-1);
00205 for(i=0; i<n; i++)
00206 ntimes[i]=start+(i*step);
00207
00208 return ntimes;
00209 }
00218 double* linspace_dbl(double first, double last, double step, double *v, int *n){
00219 int i;
00220 massert(first>last, "first>last: %f>%f", first, last);
00221 *n = (int) round(((last-first)/step)+1);
00222 if( v==ALLOC_IN_FCT ){
00223 v=(double*)malloc((*n)*sizeof(double));
00224 }
00225 for( i=0; i<*n; i++ ){
00226 v[i] = first+i*step;
00227 }
00228
00229 return v;
00230 }
00231
00236 int* linspace(int first, int last){
00237 int i;
00238 int *s;
00239 massert(first>last, "first>last: %i>%i", first, last);
00240 s=(int*)malloc((last-first+1)*sizeof(int));
00241 int j=0;
00242 for(i=first; i<=last; i++){
00243 s[j]=i;
00244 j++;
00245 }
00246 return s;
00247 }
00248
00254 double* lininterp(const double *x1, const double *y1, int n1,
00255 const double *x2, double *y2, int n2){
00256 int i, j;
00257 double m, n;
00258
00259 massert(x2[0]<x1[0], "x2[0]<x1[0]: %f < %f", x2[0], x1[0]);
00260 massert(x2[n2-1]>x1[n1-1], "x2[n2-1]>x1[n1-1]: %f > %f", x2[n2-1], x1[n1-1]);
00261
00262
00263
00264
00265 for(i=0; i<n2; i++){
00266 j=0; while(j<n1 && x2[i]>x1[j]) j++;
00267
00268 if(j==n1) n--;
00269 m = (y1[j]-y1[j-1])/(x1[j]-x1[j-1]);
00270 n = y1[j]-m*x1[j];
00271 y2[i] = m*x2[i]+n;
00272 }
00273 return y2;
00274 }
00275
00276
00277
00278
00279
00280 void dblp_print( double *v, int n ){
00281 int i;
00282 for( i=0; i<n; i++ ){
00283 fprintf( stderr, "%f\n", v[i] );
00284 }
00285 }
00286
00287 double dblp_mean( double *v, int n ){
00288 int i;
00289 double r=0.0;
00290 for( i=0; i<n; i++ ){
00291 r+=v[i];
00292 }
00293 return r/(double)n;
00294 }
00295
00296 void dblp_print_int( int *v, int n ){
00297 int i;
00298 fprintf( stderr, "[ ");
00299 for( i=0; i<n; i++ ){
00300 fprintf( stderr, "%i ", v[i] );
00301 }
00302 fprintf( stderr, "]\n");
00303
00304 }
00305
00311 double dblp_min( double *v, int n, int *idx ){
00312 int i;
00313 double min=DBL_MAX;
00314 *idx=-1;
00315
00316 for( i=0; i<n; i++ ){
00317 if( v[i] < min ){
00318 min = v[i];
00319 *idx = i;
00320 }
00321 }
00322
00323 return min;
00324 }
00325
00331 double dblp_max( double *v, int n, int *idx ){
00332 int i;
00333 double max=DBL_MIN;
00334 if( idx )
00335 *idx=-1;
00336
00337 for( i=0; i<n; i++ ){
00338 if( v[i] > max ){
00339 max = v[i];
00340 if( idx )
00341 *idx = i;
00342 }
00343 }
00344
00345 return max;
00346 }
00347
00351 void dblp_shuffle_int( int *permut, int n ){
00352 int i1,i2, i;
00353
00354 for( i=0; i<n; i++){
00355 i1 = (random() / (RAND_MAX / n+1));
00356 i2 = (random() / (RAND_MAX / n+1));
00357 swap2i( &(permut[i1]), &(permut[i2]));
00358 }
00359 }
00360
00361
00364 void dblp_minus_scalar( double *v, int n, double val ){
00365 int i;
00366 for( i=0; i<n; i++ ){
00367 v[i] = v[i]-val;
00368 }
00369 }
00370
00376 double* dblp_init( double *v, int n, double val ){
00377 int i;
00378 if( v==NULL){
00379 v = (double*)malloc( n*sizeof(double) );
00380 }
00381 for(i=0; i<n; i++){
00382 v[i] = val;
00383 }
00384
00385 return v;
00386 }
00387
00390 double dblp_euclidean_distance( const double *v1, const double *v2, int n ){
00391 int i;
00392 double r=0;
00393 for( i=0; i<n; i++ ){
00394 r += SQR( v1[i]-v2[i] );
00395 }
00396 return sqrt(r);
00397 }
00398
00399
00400
00401
00402
00405 double** dblpp_rand( double **m, int N, int M, double lower, double upper ){
00406 int i,j;
00407
00408 srand((long)time(NULL));
00409 if( !m ){
00410 m = dblpp_init( N, M );
00411 }
00412 for( i=0; i<N; i++ ){
00413 for( j=0; j<M; j++ ){
00414 m[i][j] = ( (((double)rand()) / RAND_MAX)*(upper-lower))+lower;
00415 }
00416 }
00417
00418 return m;
00419 }
00425 void dblpp_normalize_by_max( double **m, int M, int N ){
00426 double max;
00427
00428 max = dblpp_max( (const double**) m, M, N, NULL, NULL );
00429 dblpp_divide_scalar( m, M, N, max);
00430 }
00431
00439 double** dblpp_delrow(double **m, int N, int n, int row){
00440 double *tmp;
00441 int i;
00442 massert(row>N-1, "cannot delete row %i because only %i rows\n", row, N);
00443 tmp = m[row];
00444 for(i=row; i<N-1; i++){
00445 m[i]=m[i+1];
00446 }
00447 m[N-1] = tmp;
00448 return m;
00449 }
00450
00453 double** dblpp_init(int N, int M){
00454 int i,j;
00455 double **d;
00456 d = (double**) malloc( N*sizeof(double*) );
00457 for( i=0; i<N; i++){
00458 d[i] = (double*) malloc( M*sizeof(double) );
00459 for( j=0; j<M; j++ ){
00460 d[i][j]=0.0;
00461 }
00462 }
00463
00464 return d;
00465 }
00468 int** dblpp_init_int(int N, int M){
00469 int i,j;
00470 int **d;
00471
00472 d = (int**) malloc( N*sizeof(int*) );
00473 for( i=0; i<N; i++){
00474
00475 d[i] = (int*) malloc( M*sizeof(int) );
00476 for( j=0; j<M; j++ ){
00477 d[i][j]=0;
00478 }
00479 }
00480
00481 return d;
00482 }
00483
00484
00492 double** dblpp_delcol(double **m, int N, int n, int col){
00493 int i, j;
00494 double tmp;
00495 massert(col>n-1, "cannot delete col %i because only %i cols\n", col, n);
00496 for(i=0; i<N; i++){
00497 tmp = m[i][col];
00498 for(j=col; j<n-1; j++){
00499 m[i][j]=m[i][j+1];
00500 }
00501 m[i][n-1]=tmp;
00502 }
00503 return m;
00504 }
00505
00510 double dblpp_min(const double **m, int N, int n, int *i1, int *i2){
00511 int i,j;
00512 double minel=DBL_MAX;
00513 for(i=0; i<N; i++){
00514 for(j=0; j<n; j++){
00515 if(m[i][j]<minel){
00516 minel = m[i][j];
00517 if(i1 && i2){
00518 *i1 = i;
00519 *i2 = j;
00520 }
00521 }
00522 }
00523 }
00524
00525 if(i1 && i2){
00526 dprintf("dblpp_min: m(%i,%i)=%f (%f)\n", *i1, *i2, m[*i1][*i2], minel);
00527 } else {
00528 dprintf("dblpp_min: m=%f\n", minel);
00529 }
00530 return minel;
00531 }
00536 double dblpp_max(const double **m, int N, int n, int *i1, int *i2){
00537 int i,j;
00538 double maxel=DBL_MIN;
00539 for(i=0; i<N; i++){
00540 for(j=0; j<n; j++){
00541 if(m[i][j]>maxel){
00542 maxel = m[i][j];
00543 if(i1 && i2){
00544 *i1 = i;
00545 *i2 = j;
00546 }
00547 }
00548 }
00549 }
00550 if(i1 && i2){
00551 dprintf("dblpp_max: m(%i,%i)=%f (%f)\n", *i1, *i2, m[*i1][*i2], maxel);
00552 } else {
00553 dprintf("dblpp_max: %f\n", maxel);
00554 }
00555 return maxel;
00556 }
00557
00558
00561 void dblpp_print(const double **m, int N, int n){
00562 int i,j;
00563
00564 for(i=0; i<N; i++){
00565 printf("[ ");
00566 for(j=0; j<n; j++){
00567 if(m[i][j]>1000000)
00568 printf("<max> ");
00569 else
00570 printf("%2.2f ", m[i][j]);
00571 }
00572 printf(" ]\n");
00573 }
00574 }
00577 void dblpp_add_dblpp(double **m1, const double **m2, int N, int n){
00578 int i, j;
00579
00580 for( i=0; i<N; i++){
00581 for( j=0; j<n; j++ ){
00582 m1[i][j]+=m2[i][j];
00583 }
00584 }
00585 }
00586
00590 void dblpp_sub_dblpp(double **dest, const double **src, int N, int n){
00591 int i, j;
00592
00593 for( i=0; i<N; i++){
00594 for( j=0; j<n; j++ ){
00595 dest[i][j]-=src[i][j];
00596 }
00597 }
00598 }
00599
00600
00607 void dblpp_dottimes_dblpp( double **m1, const double **m2, int N, int M ){
00608 int i,j;
00609
00610 for( i=0; i<N; i++){
00611 for( j=0; j<M; j++ ){
00612 m1[i][j] = m1[i][j]*m2[i][j];
00613 }
00614 }
00615 }
00616
00619 void dblpp_copy( const double **src, double **dest, int N, int M ){
00620 int i,j;
00621
00622 for( i=0; i<N; i++ ){
00623 for( j=0; j<M; j++ ){
00624 dest[i][j] = src[i][j];
00625 }
00626 }
00627 }
00630 void dblpp_divide_scalar(double **m, int N, int n, double s){
00631 int i, j;
00632
00633 for( i=0; i<N; i++){
00634 for( j=0; j<n; j++ ){
00635 m[i][j] /= s;
00636 }
00637 }
00638 }
00639 void dblpp_add_scalar(double **m, int N, int n, double s){
00640 int i, j;
00641
00642 for( i=0; i<N; i++){
00643 for( j=0; j<n; j++ ){
00644 m[i][j] += s;
00645 }
00646 }
00647 }
00650 void dblpp_mul_scalar(double **m, int N, int n, double s){
00651 int i, j;
00652
00653 for( i=0; i<N; i++){
00654 for( j=0; j<n; j++ ){
00655 m[i][j] *= s;
00656 }
00657 }
00658 }
00659
00662 void dblpp_free(double **m, int N){
00663 int i;
00664 if( !m ){
00665 return;
00666 }
00667 for( i=0; i<N; i++){
00668 free(m[i]);
00669 }
00670 free(m);
00671 }
00672
00675 int sgn(int x){
00676 return (x > 0) ? 1 : (x < 0) ? -1 : 0;
00677 }
00678
00679
00680 void swap2i(int *v1, int *v2){
00681 int tmp;
00682 tmp = *v1;
00683 *v1 = *v2;
00684 *v2 = tmp;
00685 }
00686
00687 void swap2d(double *v1, double *v2){
00688 double tmp;
00689 tmp = *v1;
00690 *v1 = *v2;
00691 *v2 = tmp;
00692 }
00693
00694
00695
00701 double drawsample_nearest_neighbour( const double *v, int n, double x ){
00702 int x1;
00703 double r;
00704
00705 x1 = (int)round( x );
00706
00707 if( x1<0 || x1>=n ){
00708 errprintf( "(x=%f, x1=%i, n=%i)\n", x, x1, n );
00709 }
00710 r = v[x1];
00711 if( isnan( r ) ){
00712 errprintf( "r=%f (x=%f, x1=%i,v[x1]=%f, n=%i)\n", r, x, x1,v[x1],n );
00713 }
00714 return r;
00715 }
00716
00717
00728 double* resample_nearest_neighbour( const double *s, int n, int newn, double *news ){
00729 double step;
00730 int i;
00731
00732 if( news==NULL ){
00733 news = (double*) malloc( newn*sizeof( double ) );
00734 }
00735
00736 step = (double)n/(double)newn;
00737 for( i=0; i<newn; i++ ){
00738 news[i] = drawsample_nearest_neighbour( s, n, i*step );
00739 }
00740
00741 return news;
00742 }
00743
00752 double* resample_linear( const double *s, int n, int newn, double *news ){
00753 return resample_gsl( s, n, newn, news, gsl_interp_linear );
00754 }
00755
00774 double* resample_gsl( const double *s, int n, int newn, double *news, const gsl_interp_type *method ){
00775 double step;
00776 int i;
00777 double *x;
00778
00779 x = (double*)malloc( n*sizeof(double) );
00780 for( i=0; i<n; i++ ){
00781 x[i] = (double)i;
00782 }
00783 gsl_interp_accel *acc = gsl_interp_accel_alloc ();
00784 gsl_spline *spline = gsl_spline_alloc (method, n);
00785 gsl_spline_init (spline, x, s, n);
00786
00787 if( news==NULL ){
00788 news = (double*) malloc( newn*sizeof( double ) );
00789 }
00790
00791 step = (double)n/(double)newn;
00792 for( i=0; i<newn; i++ ){
00793 news[i] = gsl_spline_eval( spline, i*step, acc );
00794 }
00795
00796
00797 gsl_spline_free (spline);
00798 gsl_interp_accel_free (acc);
00799 free(x);
00800
00801 return news;
00802 }
00803
00804 double* flip_array( double *v, int n ){
00805 int i;
00806 double tmp;
00807
00808 for( i=0; i<n/2; i++){
00809 tmp = v[i];
00810 v[i] = v[n-i-1];
00811 v[n-i-1] = tmp;
00812 }
00813 return v;
00814 }
00815
00816
00817
00818 #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
00819
00827 void fft(double *data, unsigned long nn, int isign){
00828 unsigned long n,mmax,m,j,istep,i;
00829 double wtemp,wr,wpr,wpi,wi,theta;
00830 float tempr,tempi;
00831 data--;
00832
00833
00834 n=nn << 1;
00835 j=1;
00836 for (i=1;i<n;i+=2) {
00837 if (j > i) {
00838 SWAP(data[j],data[i]);
00839 SWAP(data[j+1],data[i+1]);
00840 }
00841 m=nn;
00842 while (m >= 2 && j > m) {
00843 j -= m;
00844 m >>= 1;
00845 }
00846 j += m;
00847 }
00848 mmax=2;
00849 while (n > mmax) {
00850 istep=mmax << 1;
00851 theta=isign*(6.28318530717959/mmax);
00852 wtemp=sin(0.5*theta);
00853 wpr = -2.0*wtemp*wtemp;
00854 wpi=sin(theta);
00855 wr=1.0;
00856 wi=0.0;
00857 for (m=1;m<mmax;m+=2) {
00858 for (i=m;i<=n;i+=istep) {
00859 j=i+mmax;
00860 tempr=wr*data[j]-wi*data[j+1];
00861 tempi=wr*data[j+1]+wi*data[j];
00862 data[j]=data[i]-tempr;
00863 data[j+1]=data[i+1]-tempi;
00864 data[i] += tempr;
00865 data[i+1] += tempi;
00866 }
00867 wr=(wtemp=wr)*wpr-wi*wpi+wr;
00868 wi=wi*wpr+wtemp*wpi+wi;
00869 }
00870 mmax=istep;
00871 }
00872 }
00873 #undef SWAP
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00889 double* sigext_zeros(double *data, int ns, int n){
00890 int offset, i=0;
00891 double *dptr;
00892 dprintf("Db: sigext_zeros\n");
00893
00894 offset = (n-ns)/2;
00895 dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00896 for(i=1; i<=offset; i++){
00897 data[offset-i]=0.0;
00898 data[offset+ns+i-1]=0.0;
00899 }
00900 data[n-1]=0.0;
00901 return dptr;
00902 }
00903
00904
00906 double* sigext_zerosr(double *data, int ns, int n){
00907 dprintf("Db: sigext_zerosr\n");
00908 int i;
00909 for(i=ns; i<n; i++) data[i]=0.0;
00910 return data;
00911 }
00912
00914 double* sigext_sym(double *data, int ns, int n){
00915 int offset, i=0;
00916 double *dptr;
00917 dprintf("Db: sigext_sym\n");
00918
00919 offset = (n-ns)/2;
00920 dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00921 for(i=1; i<=offset; i++){
00922 data[offset-i]=data[offset+i-1];
00923 data[offset+ns+i-1]=data[offset+ns-i];
00924 }
00925 data[n-1]=((ns-n)%2==0 ? data[offset+(n-ns)/2] : data[offset+(n-ns)/2-1]);
00926 return dptr;
00927
00928 }
00930 double* sigext_smooth(double *data, int ns, int n){
00931 int offset, i=0;
00932 double *dptr;
00933 dprintf("Db: sigext_smooth\n");
00934
00935 offset = (n-ns)/2;
00936 dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00937 for(i=1; i<=offset; i++){
00938 data[offset-i]=data[offset];
00939 data[offset+ns+i-1]=data[ns-1];
00940 }
00941 data[n-1]=data[n-2];
00942 return dptr;
00943 }
00944
00947 int next_pow2( int n ){
00948 int p;
00949 p = (int)round(glog((double)n, 2))+1;
00950 return (int)p;
00951 }
00952
00958 int iremainder( double x, double y){
00959 int result;
00960
00961 if (y != 0) {
00962 result = x-y* (int)(x/y);
00963 } else {
00964 result = 0;
00965 errprintf("division by zero!\n");
00966 }
00967
00968 return result;
00969 }
00970
00975 double gaussian( double x, double sigma, double mu ){
00976 return 1/(sigma*sqrt(2*PI)) * exp( -1 * ( SQR( (x-mu) ) /
00977 (2*SQR( sigma )) ) );
00978 }
00979
00980
00983 void scalar_minus_dblpp( double scalar, double **m, int N, int M ){
00984 int i,j;
00985
00986
00987 for( i=0; i<N; i++ ){
00988 for( j=0; j<M; j++ ){
00989 m[i][j] = scalar-m[i][j];
00990 }
00991 }
00992 }
00993
00994
01006 Complex* expand_polynomial_from_roots( const Complex *roots, int n, Complex *coeffs ){
01007 int i, j;
01008 Complex nw;
01009
01010 if( coeffs==ALLOC_IN_FCT ){
01011 coeffs = (Complex*) malloc( (n+1)*sizeof( Complex ) );
01012 }
01013
01014 coeffs[0] = complex( 1.0, 0.0 );
01015 for (i=0; i < n; i++){
01016 coeffs[i+1] = complex(0.0,0.0);
01017 }
01018 for (i=0; i < n; i++){
01019 nw = complex_mul_double( roots[i], -1.0 );
01020 for( j=n; j>=1; j-- ){
01021 coeffs[j] = complex_mul( nw, coeffs[j] );
01022 coeffs[j] = complex_add( coeffs[j], coeffs[j-1] );
01023 }
01024 coeffs[0] = complex_mul( nw, coeffs[0] );
01025 }
01026
01027
01028 return coeffs;
01029 }
01030
01031
01037 double* dblp_complex_to_real( const Complex *vc, double *vr, int n ){
01038 int i;
01039 dprintf("entering\n");
01040 if( vr==ALLOC_IN_FCT ){
01041 warnprintf("allocating in fct\n");
01042 vr = dblp_init( vr, n, 0.0 );
01043 }
01044 for( i=0; i<n; i++ ){
01045 vr[i] = vc[i].re;
01046 if( ABS(vc[i].im)>1e-10 ){
01047 warnprintf("complex number with index '%i' has nonzero imaginary part\n", i);
01048 }
01049 }
01050 return vr;
01051 }