Changeset 2269
- Timestamp:
- Nov 2, 2004, 5:30:30 PM (22 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 9 edited
-
dataManip/psFunctions.h (modified) (2 diffs)
-
dataManip/psMinimize.c (modified) (24 diffs)
-
dataManip/psStats.c (modified) (17 diffs)
-
dataManip/psStats.h (modified) (2 diffs)
-
math/psMinimize.c (modified) (24 diffs)
-
math/psPolynomial.h (modified) (2 diffs)
-
math/psSpline.h (modified) (2 diffs)
-
math/psStats.c (modified) (17 diffs)
-
math/psStats.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psFunctions.h
r2204 r2269 12 12 * @author George Gusciora, MHPCC 13 13 * 14 * @version $Revision: 1.3 1$ $Name: not supported by cvs2svn $15 * @date $Date: 2004-1 0-27 00:57:31$14 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2004-11-03 03:30:30 $ 16 16 * 17 17 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 409 409 const psSpline1D *spline); 410 410 411 psS32 p_psVectorBinDisectF32(float *bins,412 psS32 numBins,413 float x);414 415 psS32 p_psVectorBinDisectS32(psS32 *bins,416 psS32 numBins,417 psS32 x);418 419 411 psS32 p_psVectorBinDisect(psVector *bins, 420 412 psScalar *x); -
trunk/psLib/src/dataManip/psMinimize.c
r2267 r2269 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.8 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-11-0 2 19:08:33$11 * @version $Revision: 1.84 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-11-03 03:30:30 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 61 61 returned as a psVector sums. 62 62 63 XXX: change name64 63 XXX: Use a static vector. 65 64 *****************************************************************************/ 66 void p _psBuildSums1D(double x,67 psS32 polyOrder,68 psVector* sums)65 void psBuildSums1D(double x, 66 psS32 polyOrder, 67 psVector* sums) 69 68 { 70 69 psS32 i = 0; … … 74 73 sums = psVectorAlloc(polyOrder, PS_TYPE_F64); 75 74 } 76 77 75 if (polyOrder > sums->n) { 78 76 sums = psVectorRealloc(sums, polyOrder); … … 109 107 psS32 i; 110 108 psS32 k; 111 psBool mustFreeX = false;112 109 float sig; 113 110 float p; … … 150 147 } 151 148 152 if (mustFreeX == true) {153 psFree(X);154 }155 149 psFree(u); 156 157 150 psTrace(".psLib.dataManip.CalculateSecondDerivs", 4, 158 151 "---- CalculateSecondDerivs() end ----\n"); … … 171 164 polynomials which are stored in psSpline1D. 172 165 173 XXX: check types/sizes174 166 XXX: This is F32 only 175 167 *****************************************************************************/ 168 /* 176 169 float p_psNRSpline1DEval(psSpline1D *spline, 177 170 const psVector* restrict x, … … 187 180 PS_VECTOR_CHECK_NULL(y, NAN); 188 181 PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NAN); 189 182 190 183 psS32 n; 191 184 psS32 klo; … … 197 190 float D; 198 191 float Y; 199 192 200 193 n = spline->n; 201 klo = p_psVectorBinDisect F32(spline->domains, (spline->n)+1, X);194 klo = p_psVectorBinDisect32(spline->domains, (spline->n)+1, X); 202 195 khi = klo + 1; 203 196 H = (spline->domains)[khi] - (spline->domains)[klo]; … … 206 199 C = ((A*A*A)-A) * (H*H/6.0); 207 200 D = ((B*B*B)-B) * (H*H/6.0); 208 201 209 202 Y = (A * y->data.F32[klo]) + 210 203 (B * y->data.F32[khi]) + 211 204 (C * (spline->p_psDeriv2)[klo]) + 212 205 (D * (spline->p_psDeriv2)[khi]); 213 206 214 207 return(Y); 215 208 } 216 209 */ 217 210 /*****************************************************************************/ 218 211 /* FUNCTION IMPLEMENTATION - PUBLIC */ … … 239 232 240 233 XXX: usage of yErr is not specified in IfA documentation. 234 241 235 XXX: Is the x argument redundant? What do we do if the x argument is 242 236 supplied, but does not equal the domains specified in mySpline? … … 414 408 /****************************************************************************** 415 409 XXX: We assume unnormalized gaussians. 416 XXX: Currently, yErr is ignored.417 410 *****************************************************************************/ 418 411 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, … … 441 434 x = ((psVector *) (coords->data[i]))->data.F32[0]; 442 435 out->data.F32[i] = psGaussian(x, mean, stdev, false); 443 // psTrace(".psLib.dataManip.psMinimize", 6,444 // "out->data.F32[%d]: (x, m, s) is (%f, %f, %f) is %f\n", i, x, mean, stdev, out->data.F32[i]);445 436 } 446 437 … … 449 440 float tmp = (x - mean) * psGaussian(x, mean, stdev, false); 450 441 deriv->data.F32[i][0] = tmp / (stdev * stdev); 451 452 442 tmp = (x - mean) * (x - mean) * 453 443 psGaussian(x, mean, stdev, 0); … … 482 472 XXX: This must work for both F32 and F64. F32 is currently implemented. 483 473 Note: since the LUD routines are only implemented in F64, then we 484 >will have to convert all F32 input vectors to F64 regardless. So,474 will have to convert all F32 input vectors to F64 regardless. So, 485 475 the F64 port might be. 486 476 *****************************************************************************/ … … 730 720 731 721 /****************************************************************************** 732 p_psVectorFitPolynomial1DCheb(): This routine will fit a Chebyshev 733 polynomial of degree myPoly to the data points (x, y) and return the 734 coefficients of thatpolynomial.722 VectorFitPolynomial1DCheb(): This routine will fit a Chebyshev polynomial of 723 degree myPoly to the data points (x, y) and return the coefficients of that 724 polynomial. 735 725 736 726 XXX: yErr is currently ignored. … … 738 728 XXX: Use private name? 739 729 *****************************************************************************/ 740 psPolynomial1D * p_psVectorFitPolynomial1DCheby(psPolynomial1D* myPoly,730 psPolynomial1D *VectorFitPolynomial1DCheby(psPolynomial1D* myPoly, 741 731 const psVector* restrict x, 742 732 const psVector* restrict y, … … 785 775 psFree(fScalar); 786 776 787 psTrace(".psLib.dataManip. p_psVectorFitPolynomial1DCheby", 6,777 psTrace(".psLib.dataManip.VectorFitPolynomial1DCheby", 6, 788 778 "(x, X, y, f(X)) is (%f, %f, %f, %f)\n", 789 779 x->data.F64[i], X, y->data.F64[i], f->data.F64[i]); … … 809 799 810 800 /****************************************************************************** 811 p_psVectorFitPolynomial1DOrd(): This routine will fit an ordinary 812 polynomial of degree myPoly to the data points (x, y) and return the 813 coefficients of thatpolynomial.801 VectorFitPolynomial1DOrd(): This routine will fit an ordinary polynomial of 802 degree myPoly to the data points (x, y) and return the coefficients of that 803 polynomial. 814 804 815 805 XXX: Use private name? 816 806 XXX: Use recycled vectors. 817 807 *****************************************************************************/ 818 psPolynomial1D* p_psVectorFitPolynomial1DOrd(psPolynomial1D* myPoly,808 psPolynomial1D* VectorFitPolynomial1DOrd(psPolynomial1D* myPoly, 819 809 const psVector* restrict x, 820 810 const psVector* restrict y, … … 833 823 psVector* xSums = NULL; 834 824 835 psTrace(".psLib.dataManip. psVectorFitPolynomial1D", 4,836 "---- psVectorFitPolynomial1D() begin ----\n");837 // printf(" psVectorFitPolynomial1D()\n");825 psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4, 826 "---- VectorFitPolynomial1DOrd() begin ----\n"); 827 // printf("VectorFitPolynomial1D()\n"); 838 828 // for (i=0;i<x->n;i++) { 839 829 // printf("(x, y, yErr) is (%f, %f, %f)\n", x->data.F64[i], y->data.F64[i], yErr->data.F64[i]); … … 865 855 if (yErr == NULL) { 866 856 for (i = 0; i < X->n; i++) { 867 p _psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);857 psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums); 868 858 869 859 for (k = 0; k < polyOrder; k++) { … … 879 869 } else { 880 870 for (i = 0; i < X->n; i++) { 881 p _psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);871 psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums); 882 872 883 873 for (k = 0; k < polyOrder; k++) { … … 916 906 psFree(xSums); 917 907 918 psTrace(".psLib.dataManip. psVectorFitPolynomial1D", 4,919 "---- psVectorFitPolynomial1D() begin ----\n");908 psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4, 909 "---- VectorFitPolynomial1DOrd() begin ----\n"); 920 910 return (myPoly); 921 911 } … … 962 952 PS_VECTOR_GEN_X_INDEX_STATIC_F64(x64Static, y->n); 963 953 if (myPoly->type == PS_POLYNOMIAL_CHEB) { 964 p_psNormalizeVector (x64Static);954 p_psNormalizeVectorRange(x64Static, -1.0, 1.0); 965 955 } 966 956 x64 = x64Static; … … 974 964 // Call the appropriate vector fitting routine. 975 965 if (myPoly->type == PS_POLYNOMIAL_CHEB) { 976 p_psVectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64);966 VectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64); 977 967 } else if (myPoly->type == PS_POLYNOMIAL_ORD) { 978 tmpPoly = p_psVectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64);968 tmpPoly = VectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64); 979 969 } else { 980 970 psError(__func__, "unknown polynomial type.\n"); -
trunk/psLib/src/dataManip/psStats.c
r2268 r2269 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.8 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-11-0 2 19:13:03$11 * @version $Revision: 1.84 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-11-03 03:30:30 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 403 403 *****************************************************************************/ 404 404 void p_psVectorSampleMedian(const psVector* restrict myVector, 405 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 405 const psVector* restrict maskVector, 406 psU32 maskVal, 407 psStats* stats) 406 408 { 407 409 psVector* unsortedVector = NULL; // Temporary vector 408 410 psVector* sortedVector = NULL; // Temporary vector 409 psS32 i = 0; // Loop index variable410 psS32 count = 0; // # of points in this mean?411 psS32 nValues = 0; // # of points in vector412 float rangeMin = 0.0; // Exclude data below this413 float rangeMax = 0.0; // Exclude date above this411 psS32 i = 0; // Loop index variable 412 psS32 count = 0; // # of points in this mean? 413 psS32 nValues = 0; // # of points in vector 414 float rangeMin = 0.0; // Exclude data below this 415 float rangeMax = 0.0; // Exclude date above this 414 416 415 417 // Determine how many data points fit inside this min/max range 416 // and are not masked, IFthe maskVector is not NULL>418 // and are not masked, if the maskVector is not NULL> 417 419 nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats); 418 420 … … 551 553 *****************************************************************************/ 552 554 void p_psVectorSampleQuartiles(const psVector* restrict myVector, 553 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 555 const psVector* restrict maskVector, 556 psU32 maskVal, 557 psStats* stats) 554 558 { 555 559 psVector* unsortedVector = NULL; // Temporary vector 556 560 psVector* sortedVector = NULL; // Temporary vector 557 561 psS32 i = 0; // Loop index variable 558 psS32 count = 0; // # of points in this mean ?562 psS32 count = 0; // # of points in this mean. 559 563 psS32 nValues = 0; // # data points 560 564 float rangeMin = 0.0; // Exclude data below this … … 631 635 *****************************************************************************/ 632 636 void p_psVectorSampleStdev(const psVector* restrict myVector, 633 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 637 const psVector* restrict maskVector, 638 psU32 maskVal, 639 psStats* stats) 634 640 { 635 641 psS32 i = 0; // Loop index variable … … 713 719 stats 714 720 Returns 715 NULL 716 *****************************************************************************/ 717 void p_psVectorClippedStats(const psVector* restrict myVector, 718 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 721 0 for success. 722 *****************************************************************************/ 723 int p_psVectorClippedStats(const psVector* restrict myVector, 724 const psVector* restrict maskVector, 725 psU32 maskVal, 726 psStats* stats) 719 727 { 720 728 psS32 i = 0; // Loop index variable … … 726 734 psVector* tmpMask = NULL; // Temporary vector 727 735 728 // En dure that stats->clipIter is within the proper range.736 // Ensure that stats->clipIter is within the proper range. 729 737 if (!((PS_CLIPPED_NUM_ITER_LB <= stats->clipIter) && (stats->clipIter <= PS_CLIPPED_NUM_ITER_UB))) { 730 738 psError(__func__, "Unallowed value for clipIter (%d).\n", stats->clipIter); 731 } 732 // Endure that stats->clipSigma is within the proper range. 739 return(-1); 740 } 741 // Ensure that stats->clipSigma is within the proper range. 733 742 if (!((PS_CLIPPED_SIGMA_LB <= stats->clipSigma) && (stats->clipSigma <= PS_CLIPPED_SIGMA_UB))) { 734 743 psError(__func__, "Unallowed value for clipSigma (%f).\n", stats->clipSigma); 744 return(-1); 735 745 } 736 746 // We allocate a temporary mask vector since during the iterative … … 798 808 799 809 psFree(tmpMask); 800 } 801 802 void p_psNormalizeVectorF32_0(psVector* myData) 810 return(0); 811 } 812 813 /***************************************************************************** 814 *****************************************************************************/ 815 void p_psNormalizeVectorRangeF32(psVector* myData, 816 float outLow, 817 float outHigh) 803 818 { 804 819 float min = (float)HUGE; … … 815 830 } 816 831 817 // float range = max - min;818 // for (i = 0; i < myData->n; i++) {819 // myData->data.F32[i] = (myData->data.F32[i] - min) / range;820 // }821 832 for (i = 0; i < myData->n; i++) { 822 myData->data.F32[i] = (myData->data.F32[i] - min) / (max - min); 823 } 824 } 825 826 827 828 /***************************************************************************** 829 p_psNormalizeVectorF32(myData): this is a private function which normalizes the 830 elements of a vector to a range between 0.0 and 1.0. 831 832 XXX: how about an arbitrary p_psNormalizeVectorF32(myData, min, max)? 833 *****************************************************************************/ 834 void p_psNormalizeVectorF32(psVector* myData) 833 myData->data.F32[i] = outLow + (myData->data.F32[i] - min) * (outHigh - outLow) / (max - min); 834 } 835 } 836 void p_psNormalizeVectorRangeF64(psVector* myData, 837 float outLow, 838 float outHigh) 835 839 { 836 840 float min = (float)HUGE; … … 840 844 for (i = 0; i < myData->n; i++) { 841 845 if (myData->data.F32[i] < min) { 842 min = myData->data.F 32[i];846 min = myData->data.F64[i]; 843 847 } 844 848 if (myData->data.F32[i] > max) { 845 max = myData->data.F32[i]; 846 } 847 } 848 849 // float range = max - min; 850 // for (i = 0; i < myData->n; i++) { 851 // myData->data.F32[i] = (myData->data.F32[i] - min) / range; 852 // } 849 max = myData->data.F64[i]; 850 } 851 } 852 853 853 for (i = 0; i < myData->n; i++) { 854 myData->data.F32[i] = (myData->data.F32[i] - 0.5 * (min + max)) / 855 (0.5 * (max - min)); 854 myData->data.F64[i] = outLow + (myData->data.F64[i] - min) * (outHigh - outLow) / (max - min); 856 855 } 857 856 } 858 857 859 858 /***************************************************************************** 860 p_psNormalizeVectorF64(myData): this is a private function which normalizes the 861 elements of a vector to a range between -1.0 and 1.0. 862 XXX: 0-1 or -1:1? 863 864 XXX: how about an arbitrary p_psNormalizeVectorF64(myData, min, max)? 865 *****************************************************************************/ 866 void p_psNormalizeVectorF64(psVector* myData) 867 { 868 float min = (double)HUGE; 869 float max = (double)-HUGE; 870 double range = 0.0; 871 psS32 i = 0; 872 873 for (i = 0; i < myData->n; i++) { 874 if (myData->data.F64[i] < min) { 875 min = myData->data.F64[i]; 876 } 877 if (myData->data.F64[i] > max) { 878 max = myData->data.F64[i]; 879 } 880 } 881 882 range = max - min; 883 for (i = 0; i < myData->n; i++) { 884 myData->data.F64[i] = -1.0 + 2.0 * 885 ((myData->data.F64[i] - min) / range); 886 } 887 888 // for (i = 0; i < myData->n; i++) { 889 // myData->data.F64[i] = (myData->data.F64[i] - 0.5 * (min + max)) / 890 // (0.5 * (max - min)); 891 // } 892 } 893 894 // XXX: how about an arbitrary p_psNormalizeVector(myData, min, max)? 895 void p_psNormalizeVector(psVector* myData) 859 psNormalizeVectorRange(myData, low, high): this is a private function which 860 normalizes the elements of a vector to a range between low and high. 861 *****************************************************************************/ 862 void psNormalizeVectorRange(psVector* myData, 863 float low, 864 float high) 896 865 { 897 866 if (myData->type.type == PS_TYPE_F32) { 898 p_psNormalizeVector F32(myData);867 p_psNormalizeVectorRangeF32(myData, low, high); 899 868 } else if (myData->type.type == PS_TYPE_F64) { 900 p_psNormalizeVector F64(myData);869 p_psNormalizeVectorRangeF64(myData, low, high); 901 870 } else { 902 871 psError(__func__, "Unalowable data type.\n"); … … 914 883 915 884 XXX: Terminate when f(x)-getThisValue is within some error tolerance. 885 886 XXX: Solve for X analytically. 916 887 *****************************************************************************/ 917 888 float p_ps1DPolyMedian(psPolynomial1D* myPoly, … … 924 895 float oldMidpoint = 1.0; 925 896 float f = 0.0; 926 927 // printf("p_ps1DPolyMedian(%f, %f, %f) \n", rangeLow, rangeHigh, getThisValue);928 897 929 898 while (numIterations < PS_POLY_MEDIAN_MAX_ITERATIONS) { … … 956 925 and i+1 is used for x[i]). It then determines for what value x does that 957 926 quadratic f(x) = yVal (the input parameter). 927 928 XXX: After you fit the polynomial, solve for X analytically. 958 929 *****************************************************************************/ 959 930 float fitQuadraticSearchForYThenReturnX(psVector *xVec, … … 1034 1005 stats 1035 1006 Returns 1036 NULL1007 0 on success. 1037 1008 *****************************************************************************/ 1038 1009 int p_psVectorRobustStats(const psVector* restrict myVector, … … 1119 1090 tmpStats->clippedStdev / 4.0f); 1120 1091 1121 // The following was necessary to fit a gaussian to the data, since1122 // gaussian functions produce data between 0.0 and 1.0.1123 // p_psNormalizeVectorF32(robustHistogramVector);1124 1125 1092 /************************************************************************** 1126 1093 Determine the median/lower/upper quartile bin numbers. … … 1207 1174 psVector *y = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32); 1208 1175 1209 p_psNormalizeVector F32_0(robustHistogramVector);1176 p_psNormalizeVectorRange(robustHistogramVector, 0.0, 1.0); 1210 1177 for (i=0;i<robustHistogramVector->n;i++) { 1211 1178 myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32); … … 1620 1587 } 1621 1588 // ************************************************************************ 1622 // XXX: The Stdev calculation requires the mean. Should we assume the1623 // mean has already been calculated? Or should we always calculate it?1624 1589 if (stats->options & PS_STAT_SAMPLE_STDEV) { 1625 1590 p_psVectorSampleMean(inF32, mask, maskVal, stats); … … 1643 1608 1644 1609 if ((stats->options & PS_STAT_CLIPPED_MEAN) || (stats->options & PS_STAT_CLIPPED_STDEV)) { 1645 p_psVectorClippedStats(inF32, mask, maskVal, stats); 1610 if (0 != p_psVectorClippedStats(inF32, mask, maskVal, stats)) { 1611 psError(__func__, "p_psVectorClippedStats() failed.\n"); 1612 } 1646 1613 } 1647 1614 // ************************************************************************ -
trunk/psLib/src/dataManip/psStats.h
r2204 r2269 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1.3 2$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-1 0-27 00:57:31$12 * @version $Revision: 1.33 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-11-03 03:30:30 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 174 174 ); 175 175 176 177 void p_psNormalizeVector(psVector* myData); 178 179 void p_psNormalizeVectorF64(psVector* myData); 176 void psNormalizeVectorRange(psVector* myData, 177 float low, 178 float high); 180 179 181 180 /// @} -
trunk/psLib/src/math/psMinimize.c
r2267 r2269 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.8 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-11-0 2 19:08:33$11 * @version $Revision: 1.84 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-11-03 03:30:30 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 61 61 returned as a psVector sums. 62 62 63 XXX: change name64 63 XXX: Use a static vector. 65 64 *****************************************************************************/ 66 void p _psBuildSums1D(double x,67 psS32 polyOrder,68 psVector* sums)65 void psBuildSums1D(double x, 66 psS32 polyOrder, 67 psVector* sums) 69 68 { 70 69 psS32 i = 0; … … 74 73 sums = psVectorAlloc(polyOrder, PS_TYPE_F64); 75 74 } 76 77 75 if (polyOrder > sums->n) { 78 76 sums = psVectorRealloc(sums, polyOrder); … … 109 107 psS32 i; 110 108 psS32 k; 111 psBool mustFreeX = false;112 109 float sig; 113 110 float p; … … 150 147 } 151 148 152 if (mustFreeX == true) {153 psFree(X);154 }155 149 psFree(u); 156 157 150 psTrace(".psLib.dataManip.CalculateSecondDerivs", 4, 158 151 "---- CalculateSecondDerivs() end ----\n"); … … 171 164 polynomials which are stored in psSpline1D. 172 165 173 XXX: check types/sizes174 166 XXX: This is F32 only 175 167 *****************************************************************************/ 168 /* 176 169 float p_psNRSpline1DEval(psSpline1D *spline, 177 170 const psVector* restrict x, … … 187 180 PS_VECTOR_CHECK_NULL(y, NAN); 188 181 PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NAN); 189 182 190 183 psS32 n; 191 184 psS32 klo; … … 197 190 float D; 198 191 float Y; 199 192 200 193 n = spline->n; 201 klo = p_psVectorBinDisect F32(spline->domains, (spline->n)+1, X);194 klo = p_psVectorBinDisect32(spline->domains, (spline->n)+1, X); 202 195 khi = klo + 1; 203 196 H = (spline->domains)[khi] - (spline->domains)[klo]; … … 206 199 C = ((A*A*A)-A) * (H*H/6.0); 207 200 D = ((B*B*B)-B) * (H*H/6.0); 208 201 209 202 Y = (A * y->data.F32[klo]) + 210 203 (B * y->data.F32[khi]) + 211 204 (C * (spline->p_psDeriv2)[klo]) + 212 205 (D * (spline->p_psDeriv2)[khi]); 213 206 214 207 return(Y); 215 208 } 216 209 */ 217 210 /*****************************************************************************/ 218 211 /* FUNCTION IMPLEMENTATION - PUBLIC */ … … 239 232 240 233 XXX: usage of yErr is not specified in IfA documentation. 234 241 235 XXX: Is the x argument redundant? What do we do if the x argument is 242 236 supplied, but does not equal the domains specified in mySpline? … … 414 408 /****************************************************************************** 415 409 XXX: We assume unnormalized gaussians. 416 XXX: Currently, yErr is ignored.417 410 *****************************************************************************/ 418 411 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, … … 441 434 x = ((psVector *) (coords->data[i]))->data.F32[0]; 442 435 out->data.F32[i] = psGaussian(x, mean, stdev, false); 443 // psTrace(".psLib.dataManip.psMinimize", 6,444 // "out->data.F32[%d]: (x, m, s) is (%f, %f, %f) is %f\n", i, x, mean, stdev, out->data.F32[i]);445 436 } 446 437 … … 449 440 float tmp = (x - mean) * psGaussian(x, mean, stdev, false); 450 441 deriv->data.F32[i][0] = tmp / (stdev * stdev); 451 452 442 tmp = (x - mean) * (x - mean) * 453 443 psGaussian(x, mean, stdev, 0); … … 482 472 XXX: This must work for both F32 and F64. F32 is currently implemented. 483 473 Note: since the LUD routines are only implemented in F64, then we 484 >will have to convert all F32 input vectors to F64 regardless. So,474 will have to convert all F32 input vectors to F64 regardless. So, 485 475 the F64 port might be. 486 476 *****************************************************************************/ … … 730 720 731 721 /****************************************************************************** 732 p_psVectorFitPolynomial1DCheb(): This routine will fit a Chebyshev 733 polynomial of degree myPoly to the data points (x, y) and return the 734 coefficients of thatpolynomial.722 VectorFitPolynomial1DCheb(): This routine will fit a Chebyshev polynomial of 723 degree myPoly to the data points (x, y) and return the coefficients of that 724 polynomial. 735 725 736 726 XXX: yErr is currently ignored. … … 738 728 XXX: Use private name? 739 729 *****************************************************************************/ 740 psPolynomial1D * p_psVectorFitPolynomial1DCheby(psPolynomial1D* myPoly,730 psPolynomial1D *VectorFitPolynomial1DCheby(psPolynomial1D* myPoly, 741 731 const psVector* restrict x, 742 732 const psVector* restrict y, … … 785 775 psFree(fScalar); 786 776 787 psTrace(".psLib.dataManip. p_psVectorFitPolynomial1DCheby", 6,777 psTrace(".psLib.dataManip.VectorFitPolynomial1DCheby", 6, 788 778 "(x, X, y, f(X)) is (%f, %f, %f, %f)\n", 789 779 x->data.F64[i], X, y->data.F64[i], f->data.F64[i]); … … 809 799 810 800 /****************************************************************************** 811 p_psVectorFitPolynomial1DOrd(): This routine will fit an ordinary 812 polynomial of degree myPoly to the data points (x, y) and return the 813 coefficients of thatpolynomial.801 VectorFitPolynomial1DOrd(): This routine will fit an ordinary polynomial of 802 degree myPoly to the data points (x, y) and return the coefficients of that 803 polynomial. 814 804 815 805 XXX: Use private name? 816 806 XXX: Use recycled vectors. 817 807 *****************************************************************************/ 818 psPolynomial1D* p_psVectorFitPolynomial1DOrd(psPolynomial1D* myPoly,808 psPolynomial1D* VectorFitPolynomial1DOrd(psPolynomial1D* myPoly, 819 809 const psVector* restrict x, 820 810 const psVector* restrict y, … … 833 823 psVector* xSums = NULL; 834 824 835 psTrace(".psLib.dataManip. psVectorFitPolynomial1D", 4,836 "---- psVectorFitPolynomial1D() begin ----\n");837 // printf(" psVectorFitPolynomial1D()\n");825 psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4, 826 "---- VectorFitPolynomial1DOrd() begin ----\n"); 827 // printf("VectorFitPolynomial1D()\n"); 838 828 // for (i=0;i<x->n;i++) { 839 829 // printf("(x, y, yErr) is (%f, %f, %f)\n", x->data.F64[i], y->data.F64[i], yErr->data.F64[i]); … … 865 855 if (yErr == NULL) { 866 856 for (i = 0; i < X->n; i++) { 867 p _psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);857 psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums); 868 858 869 859 for (k = 0; k < polyOrder; k++) { … … 879 869 } else { 880 870 for (i = 0; i < X->n; i++) { 881 p _psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);871 psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums); 882 872 883 873 for (k = 0; k < polyOrder; k++) { … … 916 906 psFree(xSums); 917 907 918 psTrace(".psLib.dataManip. psVectorFitPolynomial1D", 4,919 "---- psVectorFitPolynomial1D() begin ----\n");908 psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4, 909 "---- VectorFitPolynomial1DOrd() begin ----\n"); 920 910 return (myPoly); 921 911 } … … 962 952 PS_VECTOR_GEN_X_INDEX_STATIC_F64(x64Static, y->n); 963 953 if (myPoly->type == PS_POLYNOMIAL_CHEB) { 964 p_psNormalizeVector (x64Static);954 p_psNormalizeVectorRange(x64Static, -1.0, 1.0); 965 955 } 966 956 x64 = x64Static; … … 974 964 // Call the appropriate vector fitting routine. 975 965 if (myPoly->type == PS_POLYNOMIAL_CHEB) { 976 p_psVectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64);966 VectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64); 977 967 } else if (myPoly->type == PS_POLYNOMIAL_ORD) { 978 tmpPoly = p_psVectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64);968 tmpPoly = VectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64); 979 969 } else { 980 970 psError(__func__, "unknown polynomial type.\n"); -
trunk/psLib/src/math/psPolynomial.h
r2204 r2269 12 12 * @author George Gusciora, MHPCC 13 13 * 14 * @version $Revision: 1.3 1$ $Name: not supported by cvs2svn $15 * @date $Date: 2004-1 0-27 00:57:31$14 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2004-11-03 03:30:30 $ 16 16 * 17 17 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 409 409 const psSpline1D *spline); 410 410 411 psS32 p_psVectorBinDisectF32(float *bins,412 psS32 numBins,413 float x);414 415 psS32 p_psVectorBinDisectS32(psS32 *bins,416 psS32 numBins,417 psS32 x);418 419 411 psS32 p_psVectorBinDisect(psVector *bins, 420 412 psScalar *x); -
trunk/psLib/src/math/psSpline.h
r2204 r2269 12 12 * @author George Gusciora, MHPCC 13 13 * 14 * @version $Revision: 1.3 1$ $Name: not supported by cvs2svn $15 * @date $Date: 2004-1 0-27 00:57:31$14 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2004-11-03 03:30:30 $ 16 16 * 17 17 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 409 409 const psSpline1D *spline); 410 410 411 psS32 p_psVectorBinDisectF32(float *bins,412 psS32 numBins,413 float x);414 415 psS32 p_psVectorBinDisectS32(psS32 *bins,416 psS32 numBins,417 psS32 x);418 419 411 psS32 p_psVectorBinDisect(psVector *bins, 420 412 psScalar *x); -
trunk/psLib/src/math/psStats.c
r2268 r2269 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.8 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-11-0 2 19:13:03$11 * @version $Revision: 1.84 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-11-03 03:30:30 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 403 403 *****************************************************************************/ 404 404 void p_psVectorSampleMedian(const psVector* restrict myVector, 405 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 405 const psVector* restrict maskVector, 406 psU32 maskVal, 407 psStats* stats) 406 408 { 407 409 psVector* unsortedVector = NULL; // Temporary vector 408 410 psVector* sortedVector = NULL; // Temporary vector 409 psS32 i = 0; // Loop index variable410 psS32 count = 0; // # of points in this mean?411 psS32 nValues = 0; // # of points in vector412 float rangeMin = 0.0; // Exclude data below this413 float rangeMax = 0.0; // Exclude date above this411 psS32 i = 0; // Loop index variable 412 psS32 count = 0; // # of points in this mean? 413 psS32 nValues = 0; // # of points in vector 414 float rangeMin = 0.0; // Exclude data below this 415 float rangeMax = 0.0; // Exclude date above this 414 416 415 417 // Determine how many data points fit inside this min/max range 416 // and are not masked, IFthe maskVector is not NULL>418 // and are not masked, if the maskVector is not NULL> 417 419 nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats); 418 420 … … 551 553 *****************************************************************************/ 552 554 void p_psVectorSampleQuartiles(const psVector* restrict myVector, 553 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 555 const psVector* restrict maskVector, 556 psU32 maskVal, 557 psStats* stats) 554 558 { 555 559 psVector* unsortedVector = NULL; // Temporary vector 556 560 psVector* sortedVector = NULL; // Temporary vector 557 561 psS32 i = 0; // Loop index variable 558 psS32 count = 0; // # of points in this mean ?562 psS32 count = 0; // # of points in this mean. 559 563 psS32 nValues = 0; // # data points 560 564 float rangeMin = 0.0; // Exclude data below this … … 631 635 *****************************************************************************/ 632 636 void p_psVectorSampleStdev(const psVector* restrict myVector, 633 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 637 const psVector* restrict maskVector, 638 psU32 maskVal, 639 psStats* stats) 634 640 { 635 641 psS32 i = 0; // Loop index variable … … 713 719 stats 714 720 Returns 715 NULL 716 *****************************************************************************/ 717 void p_psVectorClippedStats(const psVector* restrict myVector, 718 const psVector* restrict maskVector, psU32 maskVal, psStats* stats) 721 0 for success. 722 *****************************************************************************/ 723 int p_psVectorClippedStats(const psVector* restrict myVector, 724 const psVector* restrict maskVector, 725 psU32 maskVal, 726 psStats* stats) 719 727 { 720 728 psS32 i = 0; // Loop index variable … … 726 734 psVector* tmpMask = NULL; // Temporary vector 727 735 728 // En dure that stats->clipIter is within the proper range.736 // Ensure that stats->clipIter is within the proper range. 729 737 if (!((PS_CLIPPED_NUM_ITER_LB <= stats->clipIter) && (stats->clipIter <= PS_CLIPPED_NUM_ITER_UB))) { 730 738 psError(__func__, "Unallowed value for clipIter (%d).\n", stats->clipIter); 731 } 732 // Endure that stats->clipSigma is within the proper range. 739 return(-1); 740 } 741 // Ensure that stats->clipSigma is within the proper range. 733 742 if (!((PS_CLIPPED_SIGMA_LB <= stats->clipSigma) && (stats->clipSigma <= PS_CLIPPED_SIGMA_UB))) { 734 743 psError(__func__, "Unallowed value for clipSigma (%f).\n", stats->clipSigma); 744 return(-1); 735 745 } 736 746 // We allocate a temporary mask vector since during the iterative … … 798 808 799 809 psFree(tmpMask); 800 } 801 802 void p_psNormalizeVectorF32_0(psVector* myData) 810 return(0); 811 } 812 813 /***************************************************************************** 814 *****************************************************************************/ 815 void p_psNormalizeVectorRangeF32(psVector* myData, 816 float outLow, 817 float outHigh) 803 818 { 804 819 float min = (float)HUGE; … … 815 830 } 816 831 817 // float range = max - min;818 // for (i = 0; i < myData->n; i++) {819 // myData->data.F32[i] = (myData->data.F32[i] - min) / range;820 // }821 832 for (i = 0; i < myData->n; i++) { 822 myData->data.F32[i] = (myData->data.F32[i] - min) / (max - min); 823 } 824 } 825 826 827 828 /***************************************************************************** 829 p_psNormalizeVectorF32(myData): this is a private function which normalizes the 830 elements of a vector to a range between 0.0 and 1.0. 831 832 XXX: how about an arbitrary p_psNormalizeVectorF32(myData, min, max)? 833 *****************************************************************************/ 834 void p_psNormalizeVectorF32(psVector* myData) 833 myData->data.F32[i] = outLow + (myData->data.F32[i] - min) * (outHigh - outLow) / (max - min); 834 } 835 } 836 void p_psNormalizeVectorRangeF64(psVector* myData, 837 float outLow, 838 float outHigh) 835 839 { 836 840 float min = (float)HUGE; … … 840 844 for (i = 0; i < myData->n; i++) { 841 845 if (myData->data.F32[i] < min) { 842 min = myData->data.F 32[i];846 min = myData->data.F64[i]; 843 847 } 844 848 if (myData->data.F32[i] > max) { 845 max = myData->data.F32[i]; 846 } 847 } 848 849 // float range = max - min; 850 // for (i = 0; i < myData->n; i++) { 851 // myData->data.F32[i] = (myData->data.F32[i] - min) / range; 852 // } 849 max = myData->data.F64[i]; 850 } 851 } 852 853 853 for (i = 0; i < myData->n; i++) { 854 myData->data.F32[i] = (myData->data.F32[i] - 0.5 * (min + max)) / 855 (0.5 * (max - min)); 854 myData->data.F64[i] = outLow + (myData->data.F64[i] - min) * (outHigh - outLow) / (max - min); 856 855 } 857 856 } 858 857 859 858 /***************************************************************************** 860 p_psNormalizeVectorF64(myData): this is a private function which normalizes the 861 elements of a vector to a range between -1.0 and 1.0. 862 XXX: 0-1 or -1:1? 863 864 XXX: how about an arbitrary p_psNormalizeVectorF64(myData, min, max)? 865 *****************************************************************************/ 866 void p_psNormalizeVectorF64(psVector* myData) 867 { 868 float min = (double)HUGE; 869 float max = (double)-HUGE; 870 double range = 0.0; 871 psS32 i = 0; 872 873 for (i = 0; i < myData->n; i++) { 874 if (myData->data.F64[i] < min) { 875 min = myData->data.F64[i]; 876 } 877 if (myData->data.F64[i] > max) { 878 max = myData->data.F64[i]; 879 } 880 } 881 882 range = max - min; 883 for (i = 0; i < myData->n; i++) { 884 myData->data.F64[i] = -1.0 + 2.0 * 885 ((myData->data.F64[i] - min) / range); 886 } 887 888 // for (i = 0; i < myData->n; i++) { 889 // myData->data.F64[i] = (myData->data.F64[i] - 0.5 * (min + max)) / 890 // (0.5 * (max - min)); 891 // } 892 } 893 894 // XXX: how about an arbitrary p_psNormalizeVector(myData, min, max)? 895 void p_psNormalizeVector(psVector* myData) 859 psNormalizeVectorRange(myData, low, high): this is a private function which 860 normalizes the elements of a vector to a range between low and high. 861 *****************************************************************************/ 862 void psNormalizeVectorRange(psVector* myData, 863 float low, 864 float high) 896 865 { 897 866 if (myData->type.type == PS_TYPE_F32) { 898 p_psNormalizeVector F32(myData);867 p_psNormalizeVectorRangeF32(myData, low, high); 899 868 } else if (myData->type.type == PS_TYPE_F64) { 900 p_psNormalizeVector F64(myData);869 p_psNormalizeVectorRangeF64(myData, low, high); 901 870 } else { 902 871 psError(__func__, "Unalowable data type.\n"); … … 914 883 915 884 XXX: Terminate when f(x)-getThisValue is within some error tolerance. 885 886 XXX: Solve for X analytically. 916 887 *****************************************************************************/ 917 888 float p_ps1DPolyMedian(psPolynomial1D* myPoly, … … 924 895 float oldMidpoint = 1.0; 925 896 float f = 0.0; 926 927 // printf("p_ps1DPolyMedian(%f, %f, %f) \n", rangeLow, rangeHigh, getThisValue);928 897 929 898 while (numIterations < PS_POLY_MEDIAN_MAX_ITERATIONS) { … … 956 925 and i+1 is used for x[i]). It then determines for what value x does that 957 926 quadratic f(x) = yVal (the input parameter). 927 928 XXX: After you fit the polynomial, solve for X analytically. 958 929 *****************************************************************************/ 959 930 float fitQuadraticSearchForYThenReturnX(psVector *xVec, … … 1034 1005 stats 1035 1006 Returns 1036 NULL1007 0 on success. 1037 1008 *****************************************************************************/ 1038 1009 int p_psVectorRobustStats(const psVector* restrict myVector, … … 1119 1090 tmpStats->clippedStdev / 4.0f); 1120 1091 1121 // The following was necessary to fit a gaussian to the data, since1122 // gaussian functions produce data between 0.0 and 1.0.1123 // p_psNormalizeVectorF32(robustHistogramVector);1124 1125 1092 /************************************************************************** 1126 1093 Determine the median/lower/upper quartile bin numbers. … … 1207 1174 psVector *y = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32); 1208 1175 1209 p_psNormalizeVector F32_0(robustHistogramVector);1176 p_psNormalizeVectorRange(robustHistogramVector, 0.0, 1.0); 1210 1177 for (i=0;i<robustHistogramVector->n;i++) { 1211 1178 myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32); … … 1620 1587 } 1621 1588 // ************************************************************************ 1622 // XXX: The Stdev calculation requires the mean. Should we assume the1623 // mean has already been calculated? Or should we always calculate it?1624 1589 if (stats->options & PS_STAT_SAMPLE_STDEV) { 1625 1590 p_psVectorSampleMean(inF32, mask, maskVal, stats); … … 1643 1608 1644 1609 if ((stats->options & PS_STAT_CLIPPED_MEAN) || (stats->options & PS_STAT_CLIPPED_STDEV)) { 1645 p_psVectorClippedStats(inF32, mask, maskVal, stats); 1610 if (0 != p_psVectorClippedStats(inF32, mask, maskVal, stats)) { 1611 psError(__func__, "p_psVectorClippedStats() failed.\n"); 1612 } 1646 1613 } 1647 1614 // ************************************************************************ -
trunk/psLib/src/math/psStats.h
r2204 r2269 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1.3 2$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-1 0-27 00:57:31$12 * @version $Revision: 1.33 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-11-03 03:30:30 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 174 174 ); 175 175 176 177 void p_psNormalizeVector(psVector* myData); 178 179 void p_psNormalizeVectorF64(psVector* myData); 176 void psNormalizeVectorRange(psVector* myData, 177 float low, 178 float high); 180 179 181 180 /// @}
Note:
See TracChangeset
for help on using the changeset viewer.
