28 #define TYPE_ADD(a) CONCAT2X(a, CPL_TYPE)
31 TYPE_ADD(irplib_ksigma_clip)(
const CPL_TYPE * pi,
45 int pos0 = (llx - 1) + (lly - 1) * nx;
46 double nb = (double) npixs;
48 double lo_cut = *mean - kappa * (*stdev);
49 double hi_cut = *mean + kappa * (*stdev);
51 double lo_cut_p = lo_cut;
52 double hi_cut_p = hi_cut;
60 for (iclip = 0; iclip < nclip; iclip++) {
69 for (j = lly - 1; j < ury; j++, pos += (nx - urx + llx - 1)) {
70 for (i = llx - 1; i < urx; i++, pos++) {
71 if (pi[pos] > hi_cut || pi[pos] < lo_cut) {
72 const double delta = (double)pi[pos] - c_mean;
74 c_var_sum -= nb * delta * delta / (nb - 1.0);
75 c_mean -= delta / (nb - 1.0);
81 if (nb == 1.0 || c_var_sum < 0.0) {
82 cpl_msg_error(cpl_func,
"Iteration %d: Too many pixels were "
83 "removed. This may cause unexpected behaviour. "
84 "Please set a lower number of iterations "
85 "or increase the value of kappa\n", iclip);
86 cpl_error_set(cpl_func, CPL_ERROR_DIVISION_BY_ZERO);
88 c_stdev = sqrt(c_var_sum / (nb - 1.0));
91 lo_cut = c_mean - kappa * c_stdev;
92 hi_cut = c_mean + kappa * c_stdev;
94 if(fabs(lo_cut - lo_cut_p) < tolerance &&
95 fabs(hi_cut - hi_cut_p) < tolerance) {
106 return cpl_error_get_code();