Doxygen Source Code Documentation
cs_qmed.c File Reference
#include "mrilib.h"Go to the source code of this file.
Defines | |
| #define | MED3(a, b, c) |
| #define | SWAP(x, y) (temp=x,x=y,y=temp) |
| #define | SORT2(a, b) if(a>b) SWAP(a,b); |
Functions | |
| float | median_float4 (float, float, float, float) |
| float | median_float5 (float *) |
| float | median_float7 (float *) |
| float | median_float9 (float *) |
| float | qmed_float (int n, float *ar) |
| void | qmedmad_float (int n, float *ar, float *med, float *mad) |
Define Documentation
|
|
Value: Definition at line 24 of file cs_qmed.c. Referenced by qmed_float(). |
|
|
Definition at line 172 of file cs_qmed.c. Referenced by median_float5(), median_float7(), and median_float9(). |
|
|
Definition at line 30 of file cs_qmed.c. Referenced by qmed_float(). |
Function Documentation
|
||||||||||||||||||||
|
Definition at line 130 of file cs_qmed.c. Referenced by qmed_float().
00131 {
00132 register float t1,t2,t3;
00133
00134 if (a > b){t1 = a; a = b;} else t1 = b; /* t1 = max(a,b) */
00135 if (c > d){t2 = d; d = c;} else t2 = c; /* t2 = min(c,d) */
00136
00137 /* now have: a <= t1 and t2 <= d */
00138
00139 t3 = (a > t2) ? a : t2 ;
00140 t2 = (d < t1) ? d : t1 ;
00141
00142 return 0.5*(t2+t3) ;
00143 }
|
|
|
Definition at line 174 of file cs_qmed.c. Referenced by qmed_float().
|
|
|
Definition at line 182 of file cs_qmed.c. Referenced by qmed_float().
00183 {
00184 register float temp ;
00185 SORT2(p[0],p[1]) ; SORT2(p[4],p[5]) ; SORT2(p[1],p[2]) ;
00186 SORT2(p[5],p[6]) ; SORT2(p[0],p[1]) ; SORT2(p[4],p[5]) ;
00187 SORT2(p[0],p[4]) ; SORT2(p[2],p[6]) ; SORT2(p[1],p[3]) ;
00188 SORT2(p[3],p[5]) ; SORT2(p[1],p[3]) ; SORT2(p[2],p[3]) ;
00189 SORT2(p[3],p[4]) ; SORT2(p[2],p[3]) ; return(p[3]) ;
00190 }
|
|
|
Definition at line 192 of file cs_qmed.c. Referenced by qmed_float().
00193 {
00194 register float temp ;
00195 SORT2(p[1],p[2]) ; SORT2(p[4],p[5]) ; SORT2(p[7],p[8]) ;
00196 SORT2(p[0],p[1]) ; SORT2(p[3],p[4]) ; SORT2(p[6],p[7]) ;
00197 SORT2(p[1],p[2]) ; SORT2(p[4],p[5]) ; SORT2(p[7],p[8]) ;
00198 SORT2(p[0],p[3]) ; SORT2(p[5],p[8]) ; SORT2(p[4],p[7]) ;
00199 SORT2(p[3],p[6]) ; SORT2(p[1],p[4]) ; SORT2(p[2],p[5]) ;
00200 SORT2(p[4],p[7]) ; SORT2(p[4],p[2]) ; SORT2(p[6],p[4]) ;
00201 SORT2(p[4],p[2]) ; return(p[4]) ;
00202 }
|
|
||||||||||||
|
Definition at line 32 of file cs_qmed.c. References a, i, left, MED3, median_float4(), median_float5(), median_float7(), median_float9(), right, and SWAP.
00033 {
00034 register int i , j ; /* scanning indices */
00035 register float temp , pivot ; /* holding places */
00036 register float * a = ar ;
00037
00038 int left , right , mid , nodd ;
00039
00040 switch( n ){
00041 case 1: return ar[0] ;
00042 case 2: return 0.5*(ar[0]+ar[1]) ;
00043 case 3: return MED3( ar[0] , ar[1] , ar[2] ) ;
00044 case 4: return median_float4( ar[0],ar[1],ar[2],ar[3] ) ;
00045 case 5: return median_float5( ar ) ;
00046 case 7: return median_float7( ar ) ;
00047 case 9: return median_float9( ar ) ;
00048 }
00049
00050 left = 0 ; right = n-1 ; mid = n/2 ; nodd = ((n & 1) != 0) ;
00051
00052 /* loop while the subarray is at least 3 long */
00053
00054 while( right-left > 1 ){ /* work on subarray from left -> right */
00055
00056 i = ( left + right ) / 2 ; /* middle of subarray */
00057
00058 /* sort the left, middle, and right a[]'s */
00059
00060 if( a[left] > a[i] ) SWAP( a[left] , a[i] ) ;
00061 if( a[left] > a[right] ) SWAP( a[left] , a[right] ) ;
00062 if( a[i] > a[right] ) SWAP( a[right] , a[i] ) ;
00063
00064 pivot = a[i] ; /* a[i] is the median-of-3 pivot! */
00065 a[i] = a[right] ;
00066
00067 i = left ; /* initialize scanning */
00068 j = right ;
00069
00070 /*----- partition: move elements bigger than pivot up and elements
00071 smaller than pivot down, scanning in from ends -----*/
00072
00073 do{
00074 for( ; a[++i] < pivot ; ) ; /* scan i up, until a[i] >= pivot */
00075 for( ; a[--j] > pivot ; ) ; /* scan j down, until a[j] <= pivot */
00076
00077 if( j <= i ) break ; /* if j meets i, quit */
00078
00079 SWAP( a[i] , a[j] ) ;
00080 } while( 1 ) ;
00081
00082 /*----- at this point, the array is partitioned -----*/
00083
00084 a[right] = a[i] ; /* restore the pivot */
00085 a[i] = pivot ;
00086
00087 if( i == mid ){ /* good luck */
00088 if( nodd ) return pivot ; /* exact middle of array */
00089
00090 temp = a[left] ; /* must find next largest element below */
00091 for( j=left+1 ; j < i ; j++ )
00092 if( a[j] > temp ) temp = a[j] ;
00093
00094 return 0.5*(pivot+temp) ; /* return average */
00095 }
00096
00097 if( i < mid ) left = i ; /* throw away bottom partition */
00098 else right = i ; /* throw away top partition */
00099
00100 } /* end of while sub-array is long */
00101
00102 return (nodd) ? a[mid] : 0.5*(a[mid]+a[mid-1]) ;
00103 }
|
|
||||||||||||||||||||
|
Definition at line 109 of file cs_qmed.c. References free, malloc, q, and qmed_float(). Referenced by main(), plot_graphs(), and THD_outlier_count().
00110 {
00111 float * q = (float *) malloc(sizeof(float)*n) ;
00112 float me,ma ;
00113 register int ii ;
00114
00115 memcpy(q,ar,sizeof(float)*n) ; /* duplicate input array */
00116 me = qmed_float( n , q ) ; /* compute median */
00117
00118 for( ii=0 ; ii < n ; ii++ ) /* subtract off median */
00119 q[ii] = fabs(q[ii]-me) ; /* (absolute deviation) */
00120
00121 ma = qmed_float( n , q ) ; /* MAD = median absolute deviation */
00122
00123 free(q) ; /* 05 Nov 2001 */
00124
00125 *med = me ; *mad = ma ; return ;
00126 }
|