/* This function calcuate the stand variance of the data. */ doublestdvar(double * a, int num) { double sum = 0, sum_2 = 0, var;
for(int i=0; i<num; i++) { sum += a[i]; sum_2 += a[i]*a[i]; } var = sum_2/num - (sum/num)*(sum/num); if( var < 0 ) throw printf( "variance is less than 0");
return sqrt(var); }
voidtree_analysis_help(double *a, int num, double *d) { int new_num = num/2;
for ( int i = 0; i<new_num; i++ ) { d[i] = a[2*i] + a[2*i + 1] ; d[new_num + i] = a[2*i] - a[2*i + 1] ; } }
voidentropy_tree_analysis(double *a, int num, int template_length, int depth, char* save_file_name, float r_percentage = 0.1) { int num_real = num - num%( 1<<depth ); double *_b = new double[num]; double *b = _b; int start, length = num_real*2, entp_num = ( 1<<depth ) -1; double *entp; double *p_entp; p_entp = new double[entp_num];
for ( int i = 0, j = 0; i<depth; i++) { if ( i == 0 ) { entp = sampen(a, template_length, r_percentage * stdvar(a, num), num); p_entp[j] = entp[4]; j++; if ( entp != NULL ) {delete[] entp; entp = NULL;} } else { for ( start = 0, length/=2; start < num_real; start += length ) { tree_analysis_help( a + start, length, b + start ); }
for ( start = 0; start < num_real; start += length/2 ) { entp = sampen( b + start, template_length, r_percentage * stdvar( b + start, length/2 ), length/2 ); p_entp[j] = entp[4]; j++; if ( entp != NULL ) {delete[] entp; entp = NULL;} } double *temp = a; a = b; b = temp; } }