Changeset 724 for trunk/psLib/src/math/psStats.c
- Timestamp:
- May 18, 2004, 2:17:14 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psStats.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psStats.c
r716 r724 385 385 } 386 386 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.
