IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 10, 2004, 12:43:48 PM (22 years ago)
Author:
gusciora
Message:

...

File:
1 edited

Legend:

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

    r2273 r2324  
    99 *  @author GLG, MHPCC
    1010 *
    11  *  @version $Revision: 1.85 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2004-11-04 01:04:59 $
     11 *  @version $Revision: 1.86 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2004-11-10 22:43:48 $
    1313 *
    1414 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    5555psVector* p_psConvertToF32(psVector* in);
    5656
    57 int p_psVectorRobustStats(const psVector* restrict myVector,
    58                           const psVector* restrict maskVector,
    59                           psU32 maskVal,
    60                           psStats* stats);
    6157/*****************************************************************************/
    6258/* GLOBAL VARIABLES                                                          */
     
    129125
    130126/******************************************************************************
    131  ******************************************************************************
    132  ******************************************************************************
    133127    MISC PRIVATE STATISTICAL FUNCTIONS
    134128 
     
    141135        Is the in data structure NULL?
    142136        Is the in data structure of type PS_TYPE_F32?
    143  ******************************************************************************
    144  ******************************************************************************
    145  *****************************************************************************/
    146 
     137 
     138 *****************************************************************************/
    147139/******************************************************************************
    148140p_psVectorSampleMean(myVector, maskVector, maskVal, stats): calculates the
     
    155147Returns
    156148    NULL
    157 ASSUMPTION: the mean is always calculated exactly.  Robust means are never
    158 calculated in this routine.
    159149 *****************************************************************************/
    160150
     
    185175                }
    186176            }
    187             mean /= (float)count;
     177            if (count != 0) {
     178                mean /= (float)count;
     179            } else {
     180                mean = NAN;
     181            }
     182
    188183        } else {
    189184            for (i = 0; i < myVector->n; i++) {
     
    193188                }
    194189            }
    195             mean /= (float)count;
     190            if (count != 0) {
     191                mean /= (float)count;
     192            } else {
     193                mean = NAN;
     194            }
    196195        }
    197196    } else {
     
    203202                }
    204203            }
    205             mean /= (float)count;
     204            if (count != 0) {
     205                mean /= (float)count;
     206            } else {
     207                mean = NAN;
     208            }
    206209        } else {
    207210            for (i = 0; i < myVector->n; i++) {
     
    466469
    467470    // Calculate the median exactly.
    468     // XXX: Is this the correct action?
    469471    if (0 == (nValues % 2)) {
    470472        stats->sampleMedian = 0.5 * (sortedVector->data.F32[(nValues / 2) - 1] +
     
    700702        }
    701703    }
    702     countFloat = (float)countInt;
    703 
    704     #ifdef DARWIN
    705 
    706     stats->sampleStdev = (float)sqrt((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
    707     #else
    708 
    709     stats->sampleStdev = sqrtf((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
    710     #endif
     704    if (countInt < 2) {
     705        stats->sampleStdev = NAN;
     706        // XXX PS WARNING
     707    } else {
     708        countFloat = (float)countInt;
     709        #ifdef DARWIN
     710
     711        stats->sampleStdev = (float)sqrt((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
     712        #else
     713
     714        stats->sampleStdev = sqrtf((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
     715        #endif
     716
     717    }
    711718}
    712719
     
    756763    }
    757764    // 1. Compute the sample median.
    758     // XXX: This seems odd.  Verify with IfA that we want to calculate the
    759     // median here, not the mean.
    760765    p_psVectorSampleMedian(myVector, maskVector, maskVal, stats);
    761766
     
    828833    }
    829834
     835    // Ensure that max!=min before we divide by (max-min)
     836    if (FLT_EPSILON < fabs(max - min)) {
     837        for (i = 0; i < myData->n; i++) {
     838            myData->data.F32[i] = outLow + (myData->data.F32[i] - min) * (outHigh - outLow) / (max - min);
     839        }
     840    } else {
     841XXX:
     842        PS_WARNING
     843        for (i = 0; i < myData->n; i++) {
     844            myData->data.F32[i] = outLow;
     845        }
     846    }
     847
    830848    for (i = 0; i < myData->n; i++) {
    831849        myData->data.F32[i] = outLow + (myData->data.F32[i] - min) * (outHigh - outLow) / (max - min);
     
    849867    }
    850868
    851     for (i = 0; i < myData->n; i++) {
    852         myData->data.F64[i] = outLow + (myData->data.F64[i] - min) * (outHigh - outLow) / (max - min);
     869    // Ensure that max!=min before we divide by (max-min)
     870    if (FLT_EPSILON < fabs(max - min)) {
     871        for (i = 0; i < myData->n; i++) {
     872            myData->data.F64[i] = outLow + (myData->data.F64[i] - min) * (outHigh - outLow) / (max - min);
     873        }
     874    } else {
     875XXX:
     876        PS_WARNING
     877        for (i = 0; i < myData->n; i++) {
     878            myData->data.F64[i] = outLow;
     879        }
    853880    }
    854881}
     
    11571184        sumNfit += (float)robustHistogram->nums->data.U32[i];
    11581185    }
     1186    // XXX: divide by zero?
    11591187    myMean /= countFloat;
    11601188
Note: See TracChangeset for help on using the changeset viewer.