Changeset 2739 for trunk/psLib/src/dataManip/psStats.c
- Timestamp:
- Dec 16, 2004, 1:04:18 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/dataManip/psStats.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psStats.c
r2724 r2739 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.10 2$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-12-16 03:01:40$11 * @version $Revision: 1.103 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-12-16 23:04:18 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 1118 1118 1119 1119 XXX: After you fit the polynomial, solve for X analytically. 1120 1121 XXX: the vectors do not have to be the same length. Must insert the proper 1122 tests to ensure that binNum is within acceptable ranges for both vectors. 1120 1123 *****************************************************************************/ 1121 1124 float fitQuadraticSearchForYThenReturnX(psVector *xVec, … … 1126 1129 PS_VECTOR_CHECK_NULL(xVec, NAN); 1127 1130 PS_VECTOR_CHECK_NULL(yVec, NAN); 1128 PS_VECTOR_CHECK_TYPE(xVec, PS_TYPE_F 64, NAN);1129 PS_VECTOR_CHECK_TYPE(yVec, PS_TYPE_F 64, NAN);1130 PS_VECTOR_CHECK_SIZE_EQUAL(xVec, yVec, NAN);1131 PS_VECTOR_CHECK_TYPE(xVec, PS_TYPE_F32, NAN); 1132 PS_VECTOR_CHECK_TYPE(yVec, PS_TYPE_F32, NAN); 1133 // PS_VECTOR_CHECK_SIZE_EQUAL(xVec, yVec, NAN); 1131 1134 PS_INT_CHECK_RANGE(binNum, 0, (xVec->n - 1), NAN); 1132 1133 PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64); 1134 PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64); 1135 PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64); 1136 PS_POLY_1D_DECLARE_ALLOC_STATIC(myPoly, 2, PS_POLYNOMIAL_ORD); 1135 PS_INT_CHECK_RANGE(binNum, 0, (yVec->n - 1), NAN); 1136 1137 // PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64); 1138 // PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64); 1139 // PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64); 1140 // PS_POLY_1D_DECLARE_ALLOC_STATIC(myPoly, 2, PS_POLYNOMIAL_ORD); 1141 psVector *x = psVectorAlloc(3, PS_TYPE_F64); 1142 psVector *y = psVectorAlloc(3, PS_TYPE_F64); 1143 psVector *yErr = psVectorAlloc(3, PS_TYPE_F64); 1144 psPolynomial1D *myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD); 1145 1137 1146 float tmpFloat; 1138 1147 … … 1162 1171 false, 1163 1172 PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLYNOMIAL_1D_FIT); 1173 psFree(myPoly); 1174 psFree(x); 1175 psFree(y); 1176 psFree(yErr); 1164 1177 return(NAN); 1165 1178 } … … 1171 1184 false, 1172 1185 PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLY_MEDIAN); 1186 psFree(myPoly); 1187 psFree(x); 1188 psFree(y); 1189 psFree(yErr); 1173 1190 return(NAN); 1174 1191 } … … 1192 1209 } 1193 1210 1211 psFree(myPoly); 1212 psFree(x); 1213 psFree(y); 1214 psFree(yErr); 1194 1215 return(tmpFloat); 1195 1216 } … … 1394 1415 myStdev = sqrt((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1)); 1395 1416 1396 1397 1417 // Using the above (myMean, myStdev) as initial estimates, we fit a 1398 1418 // Gaussian to the robustHistogramVector. … … 1411 1431 myParams->data.F32[0] = myMean; 1412 1432 myParams->data.F32[1] = myStdev; 1433 psImage *covar = NULL; 1413 1434 psMinimizeLMChi2(min, 1414 1435 NULL, … … 1419 1440 NULL, 1420 1441 (psMinimizeLMChi2Func) psMinimizeLMChi2Gauss1D); 1442 psFree(covar); 1421 1443 psFree(min); 1422 1444 psFree(myParams); … … 1429 1451 if (fabs((myParams->data.F32[0] - myMean)/myMean) > 0.1) { 1430 1452 psLogMsg(__func__, PS_LOG_WARN, 1431 "WARNING: the fitted Gaussian has more than 10% error for the mean.\n");1453 "WARNING: the fitted Gaussian has more than 10%% error for the mean.\n"); 1432 1454 psLogMsg(__func__, PS_LOG_WARN, 1433 "WARNING: Using the calculated mean (calc, fit) is (%f, %f)\n",1455 "WARNING: Using the calculated mean instead of Gaussian-fitted mean.(calc, fit) is (%f, %f)\n", 1434 1456 myMean, myParams->data.F32[0]); 1435 1457 stats->robustMean = myMean; … … 1446 1468 if (fabs((myParams->data.F32[1] - myStdev)/myStdev) > 0.1) { 1447 1469 psLogMsg(__func__, PS_LOG_WARN, 1448 "WARNING: the fitted Gaussian has more than 10% error for the mean.\n");1470 "WARNING: the fitted Gaussian has more than 10%% error for the stdev.\n"); 1449 1471 psLogMsg(__func__, PS_LOG_WARN, 1450 "WARNING: Using the calculated mean(calc, fit) is (%f, %f)\n",1451 my Mean, myParams->data.F32[0]);1472 "WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.(calc, fit) is (%f, %f)\n", 1473 myStdev, myParams->data.F32[1]); 1452 1474 stats->robustStdev = myStdev; 1453 1475 } else { … … 1463 1485 // Take a psVector. Fit a polynomial y = f(x) to the 3 data elements 1464 1486 // surrounding medianBinNum, then find the x-value corresponding y = sumRobust/2.0. 1465 stats->robustMedian = fitQuadraticSearchForYThenReturnX(robustHistogram->bounds, 1466 cumulativeRobustSums, 1467 medianBinNum, 1468 sumRobust/2.0); 1487 1488 //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths. 1489 //Determine id that is okay. 1490 stats->robustMedian = fitQuadraticSearchForYThenReturnX( 1491 robustHistogram->bounds, 1492 cumulativeRobustSums, 1493 medianBinNum, 1494 sumRobust/2.0); 1469 1495 } 1470 1496 … … 1476 1502 countFloat = cumulativeRobustSums->data.F32[robustHistogramVector->n - 1]; 1477 1503 1478 stats->robustLQ = fitQuadraticSearchForYThenReturnX(robustHistogram->bounds, 1479 cumulativeRobustSums, 1480 LQBinNum, 1481 countFloat/4.0); 1482 stats->robustUQ = fitQuadraticSearchForYThenReturnX(robustHistogram->bounds, 1483 cumulativeRobustSums, 1484 UQBinNum, 1485 3.0 * countFloat/4.0); 1504 //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths. 1505 //Determine id that is okay. 1506 stats->robustLQ = fitQuadraticSearchForYThenReturnX( 1507 robustHistogram->bounds, 1508 cumulativeRobustSums, 1509 LQBinNum, 1510 countFloat/4.0); 1511 //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths. 1512 //Determine id that is okay. 1513 stats->robustUQ = fitQuadraticSearchForYThenReturnX( 1514 robustHistogram->bounds, 1515 cumulativeRobustSums, 1516 UQBinNum, 1517 3.0 * countFloat/4.0); 1486 1518 } 1487 1519 // XXX: I think sumNfit == sumN50 here.
Note:
See TracChangeset
for help on using the changeset viewer.
