28 template <
class T,
class SzTp>
29 static T
getMax(T*,SzTp sz,SzTp& index_of_max);
34 template <
class T,
class SzTp>
38 { idxof = 0;
return sz > 0 ? 0 :
mUdf(T); }
40 for ( ; startidx<sz &&
mIsUdf(arr[startidx]); startidx++ )
42 if ( startidx+3 > sz )
43 { idxof = startidx;
return 0; }
45 T maxval = arr[startidx]; T minval = maxval, sum = maxval;
46 SzTp minidx = startidx, maxidx = startidx;
48 for ( SzTp idx=startidx+1; idx<sz; idx++ )
50 const T val = arr[idx];
51 if (
mIsUdf(val) )
continue;
53 if ( maxval < val ) { maxidx = idx; maxval = val; }
54 if ( minval > val ) { minidx = idx; minval = val; }
58 if ( maxval == minval || nonudfsz < 3 )
59 { idxof = startidx;
return 0; }
61 const T avg = sum / nonudfsz;
63 for ( SzTp idx=startidx; idx<sz; idx++ )
65 const T val = arr[idx];
66 if (
mIsUdf(val) )
continue;
68 const T delta = avg - arr[idx];
73 const T diffmin = avg - minval;
74 const T diffmax = maxval - avg;
75 idxof = diffmin > diffmax ? minidx : maxidx;
76 return (diffmin > diffmax ? diffmin : diffmax) / stdev;