IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 41502 for trunk


Ignore:
Timestamp:
Feb 23, 2021, 8:59:19 AM (5 years ago)
Author:
eugene
Message:

carefully check element range validity for median stats

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/math/psStats.c

    r41494 r41502  
    324324    psF32 *output = outVector->data.F32; // Dereference the vector
    325325
     326    if (maskData) psAssert (maskVector-> == inVector->n, "oops");
     327
    326328    long count = 0;                     // Number of valid entries
    327329
     
    329331    // into the temporary vectors.
    330332    for (long i = 0; i < inVector->n; i++) {
    331         if (!isfinite(input[i]))
    332             continue;
    333         if (useRange && (input[i] < stats->min))
    334             continue;
    335         if (useRange && (input[i] > stats->max))
    336             continue;
    337         if (maskData && (maskData[i] & maskVal))
    338             continue;
     333        psAssert (count >= 0, "oops");
     334        psAssert (count < outVector->n, "oops");
     335        psAssert (i >= 0, "oops");
     336        psAssert (i < inVector->n, "oops");
     337
     338        if (!isfinite(input[i])) continue;
     339        if (useRange && (input[i] < stats->min)) continue;
     340        if (useRange && (input[i] > stats->max)) continue;
     341        if (maskData && (maskData[i] & maskVal)) continue;
    339342
    340343        output[count] = input[i];
     
    363366
    364367    // Calculate the median.  Use the average if the number of samples if even.
     368    int midPt = (count/2);
     369    psAssert (midPt >=           0, "oops");
     370    psAssert (midPt < outVector->n, "oops");
    365371    if (count % 2 == 0) {
    366         stats->sampleMedian = 0.5 * (output[(count/2) - 1] + output[count/2]);
     372        psAssert ((midPt - 1) >=           0, "oops");
     373        psAssert ((midPt - 1) < outVector->n, "oops");
     374        stats->sampleMedian = 0.5 * (output[midPt - 1] + output[midPt]);
    367375    } else {
    368         stats->sampleMedian = output[count/2];
    369     }
     376        stats->sampleMedian = output[midPt];
     377    }
     378
     379    int Qmin = (int)0.25*count;
     380    int Qmax = (int)0.75*count;
     381    psAssert (Qmin >=           0, "oops");
     382    psAssert (Qmin < outVector->n, "oops");
     383    psAssert (Qmax >=           0, "oops");
     384    psAssert (Qmax < outVector->n, "oops");
    370385
    371386    // Calculate the quartile points exactly.
Note: See TracChangeset for help on using the changeset viewer.