IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 18, 2004, 2:17:14 PM (22 years ago)
Author:
desonia
Message:

added a ifdef to use sqrt instead of sqrtf for OS/X machines.

File:
1 edited

Legend:

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

    r716 r724  
    385385    }
    386386    countFloat = (float) countInt;
    387     newStruct->sampleStdev = sqrtf( (sumSquares-(sumDiffs *
    388                                      sumDiffs/countFloat))/ (countFloat-1));
    389 }
    390 
    391 /******************************************************************************
    392  *****************************************************************************/
    393 void p_psArraySampleQuartiles(const psVector *restrict myVector,
    394                               const psVector *restrict maskVector,
    395                               unsigned int maskVal,
    396                               psStats *newStruct)
    397 {
    398     psVector *unsortedVector = NULL;
    399     psVector *sortedVector = NULL;
    400     int count = 0;
    401     int ind = 0;
    402     int i = 0;
    403 
    404     // return is we have already calculated both quartile points.
    405     if ((!isnan(newStruct->sampleLQ)) &&
    406             (!isnan(newStruct->sampleUQ))) {
    407         return;
    408     }
    409 
    410     if (-1 == newStruct->nValues) {
    411         p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
    412     }
    413 
    414 
    415     unsortedVector = psVectorAlloc(PS_TYPE_FLOAT, newStruct->nValues);
    416     sortedVector   = psVectorAlloc(PS_TYPE_FLOAT, newStruct->nValues);
    417 
    418     count = 0;
    419     if (maskVector != NULL) {
    420         for (i=0;i<myVector->n;i++) {
    421             if (!(maskVal & maskVector->vec.ui8[i])) {
    422                 unsortedVector->vec.f[count++] = maskVector->vec.f[i];
    423             }
    424         }
    425         psSort(sortedVector, unsortedVector);
    426     } else {
    427         psSort(sortedVector, myVector);
    428     }
    429 
    430     ind = 3 * (newStruct->nValues / 4);
    431     newStruct->sampleUQ = sortedVector->vec.f[ind];
    432     ind = (newStruct->nValues / 4);
    433     newStruct->sampleLQ = sortedVector->vec.f[ind];
    434 
    435     psVectorFree(unsortedVector);
    436     psVectorFree(sortedVector);
    437 }
    438 
    439 /******************************************************************************
    440  
    441     NOTE: The current strategy is to implement everything assuming that all
    442     input data is of type PS_TYPE_FLOAT.  Once the basic code is in place,
    443     we will macro-ize everything and add PS_TYPE_UINT16 and PS_TYPE_DOUBLE.
    444  
    445  *****************************************************************************/
    446 psStats *psArrayStats(const psVector *restrict myVector,
    447                       const psVector *restrict maskVector,
    448                       unsigned int maskVal,
    449                       psStats *stats)
    450 {
    451     psStats *newStruct = NULL;
    452 
    453     if (myVector == NULL) {
    454         psAbort(__func__,
    455                 "Input data array (myVector) was NULL.");
    456     }
    457 
    458     if (myVector->type.type != PS_TYPE_FLOAT) {
    459         psAbort(__func__,
    460                 "Only data type PS_TYPE_FLOAT is currently supported.");
    461     }
    462 
    463     if (maskVector != NULL) {
    464         if (myVector->n != maskVector->n) {
    465             psAbort(__func__,
    466                     "Vector data and vector mask are of different sizes.");
    467         }
    468         if (maskVector->type.type != PS_TYPE_UINT8) {
    469             psAbort(__func__,
    470                     "Vector mask must be type PS_TYPE_UINT8");
    471         }
    472     }
    473     newStruct = psStatsAlloc(stats->options);
    474 
    475     // ************************************************************************
    476     if (stats->options & PS_STAT_SAMPLE_MEAN) {
    477         p_psArraySampleMean(myVector, maskVector, maskVal, newStruct);
    478     }
    479 
    480     // ************************************************************************
    481     if (stats->options & PS_STAT_MAX) {
    482         p_psArrayMax(myVector, maskVector, maskVal, newStruct);
    483     }
    484 
    485     // ************************************************************************
    486     if (stats->options & PS_STAT_MIN) {
    487         p_psArrayMin(myVector, maskVector, maskVal, newStruct);
    488     }
    489 
    490     // ************************************************************************
    491     if (stats->options & PS_STAT_NVALUES) {
    492         p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
    493     }
    494 
    495     // ************************************************************************
    496     if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
    497         p_psArraySampleMedian(myVector, maskVector, maskVal, newStruct);
    498     }
    499 
    500     // ************************************************************************
    501     if (stats->options & PS_STAT_SAMPLE_STDEV) {
    502         p_psArraySampleStdev(myVector, maskVector, maskVal, newStruct);
    503     }
    504 
    505     // ************************************************************************
    506     if ((stats->options & PS_STAT_SAMPLE_UQ) ||
    507             (stats->options & PS_STAT_SAMPLE_LQ)) {
    508         p_psArraySampleQuartiles(myVector, maskVector, maskVal, newStruct);
    509     }
    510 
    511 
    512 
    513 
    514     if (stats->options & PS_STAT_ROBUST_MEAN) {
    515         newStruct->robustMean = p_psArrayXXX(myVector, maskVector, maskVal);
    516     }
    517 
    518     if (stats->options & PS_STAT_ROBUST_MEAN_NVALUES) {
    519         newStruct->robustMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
    520     }
    521 
    522     if (stats->options & PS_STAT_ROBUST_MEDIAN) {
    523         newStruct->robustMedian = p_psArrayXXX(myVector, maskVector, maskVal);
    524     }
    525 
    526     if (stats->options & PS_STAT_ROBUST_MEDIAN_NVALUES) {
    527         newStruct->robustMedianNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
    528     }
    529 
    530     if (stats->options & PS_STAT_ROBUST_MODE) {
    531         newStruct->robustMode = p_psArrayXXX(myVector, maskVector, maskVal);
    532     }
    533 
    534     if (stats->options & PS_STAT_ROBUST_MODE_NVALUES) {
    535         newStruct->robustModeNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
    536     }
    537 
    538     if (stats->options & PS_STAT_ROBUST_STDEV) {
    539         newStruct->robustStdev = p_psArrayXXX(myVector, maskVector, maskVal);
    540     }
    541 
    542     if ((stats->options & PS_STAT_ROBUST_UQ) ||
    543             (stats->options & PS_STAT_ROBUST_LQ)) {
    544         newStruct->robustLQ = p_psArrayXXX(myVector, maskVector, maskVal);
    545     }
    546 
    547     if (stats->options & PS_STAT_CLIPPED_MEAN) {
    548         newStruct->clippedMean = p_psArrayXXX(myVector, maskVector, maskVal);
    549     }
    550 
    551     if (stats->options & PS_STAT_CLIPPED_MEAN_NVALUES) {
    552         newStruct->clippedMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
    553     }
    554 
    555     if (stats->options & PS_STAT_CLIPPED_MEAN_NSIGMA) {
    556         newStruct->clipSigma = p_psArrayXXX(myVector, maskVector, maskVal);
    557     }
    558 
    559     if (stats->options & PS_STAT_CLIPPED_STDEV) {
    560         newStruct->clippedStdev = p_psArrayXXX(myVector, maskVector, maskVal);
    561     }
    562 
    563 
    564     //    OLD CODE: Should we check for an unknown option?
    565     //    default:
    566     //        psAbort(__func__, "Unknown options 0x%x.\n", stats->options);
    567 
    568     return(newStruct);
    569 }
     387    #ifdef DARWIN
     388
     389    newStruct->sampleStdev = sqrt(
     390                                 #else
     391                                 newStruct->sampleStdev = sqrtf(
     392                                                              #endif
     393                                                              (sumSquares-(sumDiffs * sumDiffs/countFloat))/ (countFloat-1));
     394                             }
     395
     396                             /******************************************************************************
     397                              *****************************************************************************/
     398                             void p_psArraySampleQuartiles(const psVector *restrict myVector,
     399                                                           const psVector *restrict maskVector,
     400                                                           unsigned int maskVal,
     401                                                           psStats *newStruct)
     402                             {
     403                                 psVector *unsortedVector = NULL;
     404                                 psVector *sortedVector = NULL;
     405                                 int count = 0;
     406                                 int ind = 0;
     407                                 int i = 0;
     408
     409                                 // return is we have already calculated both quartile points.
     410                                 if ((!isnan(newStruct->sampleLQ)) &&
     411                                         (!isnan(newStruct->sampleUQ))) {
     412                                     return;
     413                                 }
     414
     415                                 if (-1 == newStruct->nValues) {
     416                                     p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
     417                                 }
     418
     419
     420                                 unsortedVector = psVectorAlloc(PS_TYPE_FLOAT, newStruct->nValues);
     421                                 sortedVector   = psVectorAlloc(PS_TYPE_FLOAT, newStruct->nValues);
     422
     423                                 count = 0;
     424                                 if (maskVector != NULL) {
     425                                     for (i=0;i<myVector->n;i++) {
     426                                         if (!(maskVal & maskVector->vec.ui8[i])) {
     427                                             unsortedVector->vec.f[count++] = maskVector->vec.f[i];
     428                                         }
     429                                     }
     430                                     psSort(sortedVector, unsortedVector);
     431                                 } else {
     432                                     psSort(sortedVector, myVector);
     433                                 }
     434
     435                                 ind = 3 * (newStruct->nValues / 4);
     436                                 newStruct->sampleUQ = sortedVector->vec.f[ind];
     437                                 ind = (newStruct->nValues / 4);
     438                                 newStruct->sampleLQ = sortedVector->vec.f[ind];
     439
     440                                 psVectorFree(unsortedVector);
     441                                 psVectorFree(sortedVector);
     442                             }
     443
     444                             /******************************************************************************
     445                             
     446                                 NOTE: The current strategy is to implement everything assuming that all
     447                                 input data is of type PS_TYPE_FLOAT.  Once the basic code is in place,
     448                                 we will macro-ize everything and add PS_TYPE_UINT16 and PS_TYPE_DOUBLE.
     449                             
     450                              *****************************************************************************/
     451                             psStats *psArrayStats(const psVector *restrict myVector,
     452                                                   const psVector *restrict maskVector,
     453                                                   unsigned int maskVal,
     454                                                   psStats *stats)
     455                             {
     456                                 psStats *newStruct = NULL;
     457
     458                                 if (myVector == NULL) {
     459                                     psAbort(__func__,
     460                                             "Input data array (myVector) was NULL.");
     461                                 }
     462
     463                                 if (myVector->type.type != PS_TYPE_FLOAT) {
     464                                     psAbort(__func__,
     465                                             "Only data type PS_TYPE_FLOAT is currently supported.");
     466                                 }
     467
     468                                 if (maskVector != NULL) {
     469                                     if (myVector->n != maskVector->n) {
     470                                         psAbort(__func__,
     471                                                 "Vector data and vector mask are of different sizes.");
     472                                     }
     473                                     if (maskVector->type.type != PS_TYPE_UINT8) {
     474                                         psAbort(__func__,
     475                                                 "Vector mask must be type PS_TYPE_UINT8");
     476                                     }
     477                                 }
     478                                 newStruct = psStatsAlloc(stats->options);
     479
     480                                 // ************************************************************************
     481                                 if (stats->options & PS_STAT_SAMPLE_MEAN) {
     482                                     p_psArraySampleMean(myVector, maskVector, maskVal, newStruct);
     483                                 }
     484
     485                                 // ************************************************************************
     486                                 if (stats->options & PS_STAT_MAX) {
     487                                     p_psArrayMax(myVector, maskVector, maskVal, newStruct);
     488                                 }
     489
     490                                 // ************************************************************************
     491                                 if (stats->options & PS_STAT_MIN) {
     492                                     p_psArrayMin(myVector, maskVector, maskVal, newStruct);
     493                                 }
     494
     495                                 // ************************************************************************
     496                                 if (stats->options & PS_STAT_NVALUES) {
     497                                     p_psArrayNValues(myVector, maskVector, maskVal, newStruct);
     498                                 }
     499
     500                                 // ************************************************************************
     501                                 if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
     502                                     p_psArraySampleMedian(myVector, maskVector, maskVal, newStruct);
     503                                 }
     504
     505                                 // ************************************************************************
     506                                 if (stats->options & PS_STAT_SAMPLE_STDEV) {
     507                                     p_psArraySampleStdev(myVector, maskVector, maskVal, newStruct);
     508                                 }
     509
     510                                 // ************************************************************************
     511                                 if ((stats->options & PS_STAT_SAMPLE_UQ) ||
     512                                         (stats->options & PS_STAT_SAMPLE_LQ)) {
     513                                     p_psArraySampleQuartiles(myVector, maskVector, maskVal, newStruct);
     514                                 }
     515
     516
     517
     518
     519                                 if (stats->options & PS_STAT_ROBUST_MEAN) {
     520                                     newStruct->robustMean = p_psArrayXXX(myVector, maskVector, maskVal);
     521                                 }
     522
     523                                 if (stats->options & PS_STAT_ROBUST_MEAN_NVALUES) {
     524                                     newStruct->robustMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
     525                                 }
     526
     527                                 if (stats->options & PS_STAT_ROBUST_MEDIAN) {
     528                                     newStruct->robustMedian = p_psArrayXXX(myVector, maskVector, maskVal);
     529                                 }
     530
     531                                 if (stats->options & PS_STAT_ROBUST_MEDIAN_NVALUES) {
     532                                     newStruct->robustMedianNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
     533                                 }
     534
     535                                 if (stats->options & PS_STAT_ROBUST_MODE) {
     536                                     newStruct->robustMode = p_psArrayXXX(myVector, maskVector, maskVal);
     537                                 }
     538
     539                                 if (stats->options & PS_STAT_ROBUST_MODE_NVALUES) {
     540                                     newStruct->robustModeNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
     541                                 }
     542
     543                                 if (stats->options & PS_STAT_ROBUST_STDEV) {
     544                                     newStruct->robustStdev = p_psArrayXXX(myVector, maskVector, maskVal);
     545                                 }
     546
     547                                 if ((stats->options & PS_STAT_ROBUST_UQ) ||
     548                                         (stats->options & PS_STAT_ROBUST_LQ)) {
     549                                     newStruct->robustLQ = p_psArrayXXX(myVector, maskVector, maskVal);
     550                                 }
     551
     552                                 if (stats->options & PS_STAT_CLIPPED_MEAN) {
     553                                     newStruct->clippedMean = p_psArrayXXX(myVector, maskVector, maskVal);
     554                                 }
     555
     556                                 if (stats->options & PS_STAT_CLIPPED_MEAN_NVALUES) {
     557                                     newStruct->clippedMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
     558                                 }
     559
     560                                 if (stats->options & PS_STAT_CLIPPED_MEAN_NSIGMA) {
     561                                     newStruct->clipSigma = p_psArrayXXX(myVector, maskVector, maskVal);
     562                                 }
     563
     564                                 if (stats->options & PS_STAT_CLIPPED_STDEV) {
     565                                     newStruct->clippedStdev = p_psArrayXXX(myVector, maskVector, maskVal);
     566                                 }
     567
     568
     569                                 //    OLD CODE: Should we check for an unknown option?
     570                                 //    default:
     571                                 //        psAbort(__func__, "Unknown options 0x%x.\n", stats->options);
     572
     573                                 return(newStruct);
     574                             }
Note: See TracChangeset for help on using the changeset viewer.