Changeset 5819
- Timestamp:
- Dec 20, 2005, 1:53:14 PM (21 years ago)
- Location:
- trunk/psLib
- Files:
-
- 2 edited
-
src/math/psMinimize.c (modified) (7 diffs)
-
test/math/Makefile.am (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimize.c
r5818 r5819 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1.14 8$ $Name: not supported by cvs2svn $13 * @date $Date: 2005-12-20 2 2:41:06$12 * @version $Revision: 1.149 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2005-12-20 23:53:03 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 486 486 psVector *b) 487 487 { 488 489 488 int *indxc,*indxr,*ipiv; 490 489 int Nx, icol, irow; … … 512 511 for (j = 0; j < Nx; j++) { 513 512 if (!isfinite(matrix[i][j])) { 514 psError(PS_ERR_UNKNOWN, false, "Input matrix contains NaNs .\n");513 psError(PS_ERR_UNKNOWN, false, "Input matrix contains NaNs: matrix[%d][%d] is %.2f\n", i, j, matrix[i][j]); 515 514 goto fescape; 516 515 } … … 1430 1429 } 1431 1430 1432 ySum = 1.0; 1433 for (int j = 0; j < nYsum; j++) { 1434 xSum = ySum; 1431 xSum = 1.0; 1432 for (int i = 0; i < nXsum; i++) { 1433 ySum = xSum; 1434 for (int j = 0; j < nYsum; j++) { 1435 sums->data.F64[i][j] = ySum; 1436 ySum *= y; 1437 } 1438 xSum *= x; 1439 } 1440 1441 if (0) { 1442 printf("--------------------- BuildSums2D(%.2f %.2f) ---------------------\n", x, y); 1435 1443 for (int i = 0; i < nXsum; i++) { 1436 sums->data.F64[i][j] = xSum; 1437 xSum *= x; 1438 } 1439 ySum *= y; 1440 } 1444 for (int j = 0; j < nYsum; j++) { 1445 printf("(%.2f) ", sums->data.F64[i][j]); 1446 } 1447 printf("\n"); 1448 } 1449 } 1450 1441 1451 return (sums); 1442 1452 } 1443 1453 1444 1454 /****************************************************************************** 1445 BuildSums3D(sums, x, y, z, nXterm, nYterm, nZterm): this routine calculates the powers of1446 input parameter "x", "y", and "z" between 0 and input parameter nXterms*2, 1447 n Yterm*2, and nZterm*2. The result is returned as a psImagesums.1455 BuildSums3D(sums, x, y, z, nXterm, nYterm, nZterm): this routine calculates 1456 the powers of input parameter "x", "y", and "z" between 0 and input parameter 1457 nXterms*2, nYterm*2, and nZterm*2. The result is returned as a 3-D array sums. 1448 1458 *****************************************************************************/ 1449 1459 static psF64 ***BuildSums3D( … … 1477 1487 // careful with this function: there is no size checking and realloc for reuse 1478 1488 1479 zSum = 1.0; 1480 for (int k = 0; k < nZsum; k++) { 1481 ySum = zSum; 1482 for (int j = 0; j < nYsum; j++) { 1483 xSum = ySum; 1484 for (int i = 0; i < nXsum; i++) { 1485 sums[i][j][k] = xSum; 1486 xSum *= x; 1487 } 1488 ySum *= y; 1489 } 1490 zSum *= z; 1491 } 1489 if (1) { 1490 zSum = 1.0; 1491 for (int k = 0; k < nZsum; k++) { 1492 ySum = zSum; 1493 for (int j = 0; j < nYsum; j++) { 1494 xSum = ySum; 1495 for (int i = 0; i < nXsum; i++) { 1496 sums[i][j][k] = xSum; 1497 xSum *= x; 1498 } 1499 ySum *= y; 1500 } 1501 zSum *= z; 1502 } 1503 } else { 1504 xSum = 1.0; 1505 for (int i = 0; i < nXsum; i++) { 1506 ySum = xSum; 1507 for (int j = 0; j < nYsum; j++) { 1508 zSum = ySum; 1509 for (int k = 0; k < nZsum; k++) { 1510 sums[i][j][k] = zSum; 1511 zSum *= z; 1512 } 1513 ySum *= y; 1514 } 1515 xSum *= x; 1516 } 1517 } 1518 1519 if (0) { 1520 printf("--------------------- BuildSums3D(%.2f %.2f %.2f) ---------------------\n", x, y, z); 1521 for (int k = 0; k < nXsum; k++) { 1522 for (int j = 0; j < nYsum; j++) { 1523 for (int i = 0; i < nZsum; i++) { 1524 printf("(%.2f) ", sums[k][j][i]); 1525 } 1526 printf("\n"); 1527 } 1528 } 1529 } 1530 1492 1531 return (sums); 1493 1532 } … … 2760 2799 for (int iy = 0; iy < nYterm; iy++) { 2761 2800 for (int iz = 0; iz < nZterm; iz++) { 2762 if (myPoly->mask[ix][iy][iz]) 2801 if (myPoly->mask[ix][iy][iz]) { 2763 2802 continue; 2764 int nx = ix+iy*nXterm+iz*nXterm*nYterm; 2765 B->data.F64[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt; 2803 } else { 2804 int nx = ix + iy*nXterm + iz*nXterm*nYterm; 2805 B->data.F64[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt; 2806 } 2766 2807 } 2767 2808 } … … 2808 2849 } 2809 2850 2810 // PS_IMAGE_PRINT_F64(A); 2811 // PS_VECTOR_PRINT_F64(B); 2812 // does the solution in place 2813 if (false == psGaussJordan (A, B)) { 2814 psFree(A); 2815 psFree(B); 2816 2817 for (int ix = 0; ix < 2*nXterm; ix++) { 2818 for (int iy = 0; iy < 2*nYterm; iy++) { 2819 psFree(Sums[ix][iy]); 2820 } 2821 psFree(Sums[ix]); 2822 } 2823 psFree(Sums); 2824 psError(PS_ERR_UNKNOWN, false, "Failed to perform GaussJordan elimination.\n"); 2825 return(NULL); 2826 } 2827 2828 // select the appropriate solution entries 2829 for (int ix = 0; ix < nXterm; ix++) { 2830 for (int iy = 0; iy < nYterm; iy++) { 2831 for (int iz = 0; iz < nZterm; iz++) { 2832 int nx = ix+iy*nXterm+iz*nXterm*nYterm; 2833 myPoly->coeff[ix][iy][iz] = B->data.F64[nx]; 2834 myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[nx][nx]); 2835 } 2836 } 2837 } 2838 2851 if (0) { 2852 // does the solution in place 2853 // The matrices were overflowing, so I switched to LUD. 2854 if (false == psGaussJordan (A, B)) { 2855 psFree(A); 2856 psFree(B); 2857 2858 for (int ix = 0; ix < 2*nXterm; ix++) { 2859 for (int iy = 0; iy < 2*nYterm; iy++) { 2860 psFree(Sums[ix][iy]); 2861 } 2862 psFree(Sums[ix]); 2863 } 2864 psFree(Sums); 2865 psError(PS_ERR_UNKNOWN, false, "Failed to perform GaussJordan elimination.\n"); 2866 return(NULL); 2867 } 2868 // select the appropriate solution entries 2869 for (int ix = 0; ix < nXterm; ix++) { 2870 for (int iy = 0; iy < nYterm; iy++) { 2871 for (int iz = 0; iz < nZterm; iz++) { 2872 int nx = ix+iy*nXterm+iz*nXterm*nYterm; 2873 myPoly->coeff[ix][iy][iz] = B->data.F64[nx]; 2874 myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[nx][nx]); 2875 } 2876 } 2877 } 2878 } else { 2879 // LUD version of the fit 2880 psImage *ALUD = NULL; 2881 psVector* outPerm = NULL; 2882 psVector* coeffs = NULL; 2883 2884 ALUD = psImageAlloc(nTerm, nTerm, PS_TYPE_F64); 2885 ALUD = psMatrixLUD(ALUD, &outPerm, A); 2886 coeffs = psMatrixLUSolve(coeffs, ALUD, B, outPerm); 2887 2888 // select the appropriate solution entries 2889 for (int ix = 0; ix < nXterm; ix++) { 2890 for (int iy = 0; iy < nYterm; iy++) { 2891 for (int iz = 0; iz < nZterm; iz++) { 2892 int nx = ix+iy*nXterm+iz*nXterm*nYterm; 2893 myPoly->coeff[ix][iy][iz] = coeffs->data.F64[nx]; 2894 myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[nx][nx]); 2895 } 2896 } 2897 } 2898 2899 psFree(ALUD); 2900 psFree(coeffs); 2901 psFree(outPerm); 2902 } 2839 2903 psFree(A); 2840 2904 psFree(B); -
trunk/psLib/test/math/Makefile.am
r5813 r5819 43 43 tst_psPolyFit1DCheby \ 44 44 tst_psPolyFit1DOrd \ 45 tst_psPolyFit2DOrd 45 tst_psPolyFit2DOrd \ 46 tst_psPolyFit3DOrd \ 47 tst_psPolyFit4DOrd 46 48 47 49 … … 84 86 tst_psPolyFit1DOrd_SOURCES = tst_psPolyFit1DOrd.c 85 87 tst_psPolyFit2DOrd_SOURCES = tst_psPolyFit2DOrd.c 88 tst_psPolyFit3DOrd_SOURCES = tst_psPolyFit3DOrd.c 89 tst_psPolyFit4DOrd_SOURCES = tst_psPolyFit4DOrd.c 86 90 87 91 check_DATA =
Note:
See TracChangeset
for help on using the changeset viewer.
