IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 13, 2004, 4:44:09 PM (22 years ago)
Author:
gusciora
Message:

Added Stdev calculation.

File:
1 edited

Legend:

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

    r679 r682  
    33#include <string.h>
    44#include <stdarg.h>
    5 /******************************************************************************
    65//#include "pslib.h"
    76#include "psMemory.h"
     
    1110//#include "psError.h"
    1211//#include "psArray.h"
    13  *****************************************************************************/
    1412#include "psStats.h"
     13
     14#include "float.h"
     15#include <math.h>
     16
    1517/******************************************************************************
    1618    psStatsAlloc(): This routine must create a new psStats data structure.
     
    1921{
    2022    psStats *newStruct = NULL;
     23
    2124    newStruct = (psStats *) psAlloc(sizeof(psStats));
    22     newStruct->sampleMean = 0.0;
    23     newStruct->sampleMedian = 0.0;
    24     newStruct->sampleStdev = 0.0;
    25     newStruct->sampleUQ = 0.0;
    26     newStruct->sampleLQ = 0.0;
    27     newStruct->robustMean = 0.0;
     25    newStruct->sampleMean = NAN;
     26    newStruct->sampleMedian = NAN;
     27    newStruct->sampleStdev = NAN;
     28    newStruct->sampleUQ = NAN;
     29    newStruct->sampleLQ = NAN;
     30    newStruct->robustMean = NAN;
    2831    newStruct->robustMeanNvalues = 0;
    29     newStruct->robustMedian = 0.0;
     32    newStruct->robustMedian = NAN;
    3033    newStruct->robustMedianNvalues = 0;
    31     newStruct->robustMode = 0.0;
     34    newStruct->robustMode = NAN;
    3235    newStruct->robustModeNvalues = 0;
    33     newStruct->robustStdev = 0.0;
    34     newStruct->robustUQ = 0.0;
    35     newStruct->robustLQ = 0.0;
    36     newStruct->clippedMean = 0.0;
     36    newStruct->robustStdev = NAN;
     37    newStruct->robustUQ = NAN;
     38    newStruct->robustLQ = NAN;
     39    newStruct->clippedMean = NAN;
    3740    newStruct->clippedMeanNvalues = 0;
    38     newStruct->clippedStdev = 0.0;
    39     newStruct->clipSigma = 0.0;
     41    newStruct->clippedStdev = NAN;
     42    newStruct->clipSigma = NAN;
    4043    newStruct->clipIter = 0;
    41     newStruct->min = 0.0;
    42     newStruct->max = 0.0;
     44    newStruct->min = NAN;
     45    newStruct->max = NAN;
    4346    newStruct->nValues = 0;
    4447    newStruct->options = options;
     
    156159    MISC STATISTICAL FUNCTIONS
    157160 *****************************************************************************/
    158 float p_psArraySampleMean(const psVector *restrict myVector,
    159                           const psVector *restrict maskVector,
    160                           unsigned int maskVal)
     161void p_psArraySampleMean(const psVector *restrict myVector,
     162                         const psVector *restrict maskVector,
     163                         unsigned int maskVal,
     164                         psStats *newStruct)
    161165{
    162166    int i = 0;
     
    178182        mean/= (float) myVector->n;
    179183    }
    180     return(mean);
    181 }
    182 
    183 float p_psArrayMax(const psVector *restrict myVector,
    184                    const psVector *restrict maskVector,
    185                    unsigned int maskVal)
     184    newStruct->sampleMean = mean;
     185}
     186
     187void p_psArrayMax(const psVector *restrict myVector,
     188                  const psVector *restrict maskVector,
     189                  unsigned int maskVal,
     190                  psStats *newStruct)
    186191{
    187192    int i = 0;
    188193    float max = -1e99;
    189194
    190     printf("COOL: p_psArrayMax()\n");
    191195    if (maskVector != NULL) {
    192196        for (i=0;i<myVector->n;i++) {
     
    204208        }
    205209    }
    206     return(max);
    207 }
    208 
    209 float p_psArrayMin(const psVector *restrict myVector, /* FLOATS */
    210                    const psVector *restrict maskVector, /* INTS */
    211                    unsigned int maskVal)
     210    newStruct->max = max;
     211}
     212
     213void p_psArrayMin(const psVector *restrict myVector, /* FLOATS */
     214                  const psVector *restrict maskVector, /* INTS */
     215                  unsigned int maskVal,
     216                  psStats *newStruct)
    212217{
    213218    int i = 0;
     
    229234        }
    230235    }
    231     return(min);
     236    newStruct->min = min;
    232237}
    233238
     
    235240 
    236241 *****************************************************************************/
    237 int p_psArrayNValues(const psVector *restrict myVector, // float
    238                      const psVector *restrict maskVector, // ints
    239                      unsigned int maskVal)
     242void p_psArrayNValues(const psVector *restrict myVector,
     243                      const psVector *restrict maskVector,
     244                      unsigned int maskVal,
     245                      psStats *newStruct)
    240246{
    241247    int i = 0;
     
    251257        numData = myVector->n;
    252258    }
    253     return(numData);
     259    newStruct->nValues = numData;
    254260}
    255261
     
    257263
    258264#define MEDIAN_SIZE_THRESHOLD 10000
    259 float p_psArraySampleMedian(const psVector *restrict myVector,
    260                             const psVector *restrict maskVector,
    261                             unsigned int maskVal)
     265void p_psArraySampleMedian(const psVector *restrict myVector,
     266                           const psVector *restrict maskVector,
     267                           unsigned int maskVal,
     268                           psStats *newStruct)
    262269{
    263270    psVector *unsortedVector = NULL;
     
    268275    float median = 0.0;
    269276
    270     dataSize = p_psArrayNValues(myVector, maskVector, maskVal);
     277    p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
    271278
    272279    if (dataSize < MEDIAN_SIZE_THRESHOLD) {
     
    307314    psVectorFree(unsortedVector);
    308315    psVectorFree(sortedVector);
    309     return(median);
    310 }
    311 
    312 
    313 int p_psArrayXXX(const psVector *restrict myVector,
    314                  const psVector *restrict maskVector,
    315                  unsigned int maskVal)
     316    newStruct->sampleMedian = median;
     317}
     318
     319
     320float p_psArrayXXX(const psVector *restrict myVector,
     321                   const psVector *restrict maskVector,
     322                   unsigned int maskVal)
    316323{
    317324    printf("ERROR: Don't call me: p_psArrayXXX()\n");
    318325    exit(1);
     326}
     327
     328void p_psArraySampleStdev(const psVector *restrict myVector,
     329                          const psVector *restrict maskVector,
     330                          unsigned int maskVal,
     331                          psStats *newStruct)
     332{
     333    int i            = 0;
     334    int countInt     = 0;
     335    float countFloat = 0.0;
     336    float       mean = 0.0;
     337    float       diff = 0.0;
     338    float sumSquares = 0.0;
     339    float sumDiffs = 0.0;
     340
     341    if (0 != isnan(newStruct->sampleMean)) {
     342        p_psArraySampleMean(myVector, maskVector, maskVal, newStruct);
     343    }
     344    mean = newStruct->sampleMean;
     345
     346    if (maskVector != NULL) {
     347        for (i=0;i<myVector->n;i++) {
     348            if (!(maskVal & maskVector->vec.ui8[i])) {
     349                diff = myVector->vec.f[i] - mean;
     350                sumSquares+= (diff * diff);
     351                sumDiffs+= diff;
     352                countInt++;
     353
     354            }
     355        }
     356    } else {
     357        for (i=0;i<myVector->n;i++) {
     358            diff = myVector->vec.f[i] - mean;
     359            sumSquares+= (diff * diff);
     360            sumDiffs+= diff;
     361            countInt++;
     362        }
     363        countInt = myVector->n;
     364    }
     365    countFloat = (float) countInt;
     366    newStruct->sampleStdev = sqrtf( (sumSquares-(sumDiffs *
     367                                     sumDiffs/countFloat))/ (countFloat-1));
    319368}
    320369
     
    333382    psStats *newStruct = NULL;
    334383
    335     newStruct = psStatsAlloc(stats->options);
    336384    if (myVector == NULL) {
    337385        psAbort(__func__,
     
    354402        }
    355403    }
     404    newStruct = psStatsAlloc(stats->options);
    356405
    357406    if (stats->options & PS_STAT_SAMPLE_MEAN) {
    358         newStruct->sampleMean = p_psArraySampleMean(myVector,
    359                                 maskVector,
    360                                 maskVal);
     407        p_psArraySampleMean(myVector, maskVector, maskVal, newStruct);
    361408    }
    362409
    363410    if (stats->options & PS_STAT_MAX) {
    364         newStruct->max = p_psArrayMax(myVector, maskVector, maskVal);
     411        p_psArrayMax(myVector, maskVector, maskVal, newStruct);
    365412    }
    366413
    367414    if (stats->options & PS_STAT_MIN) {
    368         newStruct->min = p_psArrayMin(myVector, maskVector, maskVal);
     415        p_psArrayMin(myVector, maskVector, maskVal, newStruct);
    369416    }
    370417
    371418    if (stats->options & PS_STAT_NVALUES) {
    372         newStruct->nValues = p_psArrayNValues(myVector, maskVector, maskVal);
    373     }
    374 
    375     if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
    376         newStruct->sampleMedian = p_psArrayXXX(myVector, maskVector, maskVal);
    377     }
     419        p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
     420    }
     421
     422    if (stats->options & PS_STAT_SAMPLE_MEDIAN) {}
    378423
    379424    if (stats->options & PS_STAT_SAMPLE_STDEV) {
    380         newStruct->sampleStdev = p_psArrayXXX(myVector, maskVector, maskVal);
     425        p_psArraySampleStdev(myVector, maskVector, maskVal, newStruct);
    381426    }
    382427
Note: See TracChangeset for help on using the changeset viewer.