IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 5819


Ignore:
Timestamp:
Dec 20, 2005, 1:53:14 PM (21 years ago)
Author:
gusciora
Message:

The 3D fitting code should work, I have working tests for it. I had
to switch from GaussJordan to LUD because the matrix was overflowing.

Location:
trunk/psLib
Files:
2 edited

Legend:

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

    r5818 r5819  
    1010 *  @author EAM, IfA
    1111 *
    12  *  @version $Revision: 1.148 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-12-20 22:41:06 $
     12 *  @version $Revision: 1.149 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-12-20 23:53:03 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    486486    psVector *b)
    487487{
    488 
    489488    int *indxc,*indxr,*ipiv;
    490489    int Nx, icol, irow;
     
    512511        for (j = 0; j < Nx; j++) {
    513512            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]);
    515514                goto fescape;
    516515            }
     
    14301429    }
    14311430
    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);
    14351443        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
    14411451    return (sums);
    14421452}
    14431453
    14441454/******************************************************************************
    1445 BuildSums3D(sums, x, y, z, nXterm, nYterm, nZterm): this routine calculates the powers of
    1446 input parameter "x", "y", and "z" between 0 and input parameter nXterms*2,
    1447 nYterm*2, and nZterm*2.  The result is returned as a psImage sums.
     1455BuildSums3D(sums, x, y, z, nXterm, nYterm, nZterm): this routine calculates
     1456the powers of input parameter "x", "y", and "z" between 0 and input parameter
     1457nXterms*2, nYterm*2, and nZterm*2.  The result is returned as a 3-D array sums.
    14481458 *****************************************************************************/
    14491459static psF64 ***BuildSums3D(
     
    14771487    // careful with this function: there is no size checking and realloc for reuse
    14781488
    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
    14921531    return (sums);
    14931532}
     
    27602799            for (int iy = 0; iy < nYterm; iy++) {
    27612800                for (int iz = 0; iz < nZterm; iz++) {
    2762                     if (myPoly->mask[ix][iy][iz])
     2801                    if (myPoly->mask[ix][iy][iz]) {
    27632802                        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                    }
    27662807                }
    27672808            }
     
    28082849    }
    28092850
    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    }
    28392903    psFree(A);
    28402904    psFree(B);
  • trunk/psLib/test/math/Makefile.am

    r5813 r5819  
    4343    tst_psPolyFit1DCheby \
    4444    tst_psPolyFit1DOrd \
    45     tst_psPolyFit2DOrd
     45    tst_psPolyFit2DOrd \
     46    tst_psPolyFit3DOrd \
     47    tst_psPolyFit4DOrd
    4648
    4749
     
    8486tst_psPolyFit1DOrd_SOURCES = tst_psPolyFit1DOrd.c
    8587tst_psPolyFit2DOrd_SOURCES = tst_psPolyFit2DOrd.c
     88tst_psPolyFit3DOrd_SOURCES = tst_psPolyFit3DOrd.c
     89tst_psPolyFit4DOrd_SOURCES = tst_psPolyFit4DOrd.c
    8690
    8791check_DATA =
Note: See TracChangeset for help on using the changeset viewer.