IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 22, 2005, 4:09:39 PM (21 years ago)
Author:
magnier
Message:

added optimization to 3D polynomial fit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_rel9_b1/psLib/src/math/psMinimize.c

    r5812 r5827  
    1010 *  @author EAM, IfA
    1111 *
    12  *  @version $Revision: 1.147.4.1.2.4 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-12-19 19:44:27 $
     12 *  @version $Revision: 1.147.4.1.2.5 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-12-23 02:09:39 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    14631463    psF64 zSum = 1.0;
    14641464
     1465    psF64 ***vsX;
     1466    psF64 **vsY;
     1467    psF64 *vsZ;
     1468
    14651469    nXsum = 2*nXterm;
    14661470    nYsum = 2*nYterm;
     
    14771481    // careful with this function: there is no size checking and realloc for reuse
    14781482
    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;
     1483    xSum = 1.0;
     1484    vsX = sums;
     1485    for (int i = 0; i < nXsum; i++, vsX++) {
     1486        ySum = xSum;
     1487        vsY = *vsX;
     1488        for (int j = 0; j < nYsum; j++, vsY++) {
     1489            zSum = ySum;
     1490            vsZ = *vsY;
     1491            for (int k = 0; k < nZsum; k++, vsZ++) {
     1492                // sums[i][j][k] = xSum;
     1493                *vsZ = zSum;
     1494                zSum *= z;
    14871495            }
    14881496            ySum *= y;
    14891497        }
    1490         zSum *= z;
     1498        xSum *= x;
    14911499    }
    14921500    return (sums);
     
    26362644    psImageInit (A, 0.0);
    26372645
     2646    // use these pointers to minimize the indirections
     2647    psF64 *vB = B->data.F64;
     2648    psF64 **vA = A->data.F64;
     2649    psU8 ***vM = myPoly->mask;
     2650
    26382651    // Sums look like: 1, x, x^2, ... x^(2n+1), y, xy, x^2y, ... x^(2n+1)*y, ...
     2652
     2653    # define NTERM(X,Y,Z)((X)*nYterm*nZterm + (Y)*nZterm + (Z))
    26392654
    26402655    // Build the B and A data structs.
     
    26582673            for (int iy = 0; iy < nYterm; iy++) {
    26592674                for (int iz = 0; iz < nZterm; iz++) {
    2660                     if (myPoly->mask[ix][iy][iz])
     2675                    if (vM[ix][iy][iz])
    26612676                        continue;
    2662                     int nx = ix+iy*nXterm+iz*nXterm*nYterm;
    2663                     B->data.F64[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt;
     2677                    int nx = NTERM(ix,iy,iz);
     2678                    vB[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt;
    26642679                }
    26652680            }
     
    26692684            for (int iy = 0; iy < nYterm; iy++) {
    26702685                for (int iz = 0; iz < nZterm; iz++) {
    2671                     if (myPoly->mask[ix][iy][iz])
     2686                    if (vM[ix][iy][iz])
    26722687                        continue;
    2673                     int nx = ix+iy*nXterm+iz*nXterm*nYterm;
    2674                     for (int jx = 0; jx < nXterm; jx++) {
    2675                         for (int jy = 0; jy < nYterm; jy++) {
    2676                             for (int jz = 0; jz < nZterm; jz++) {
    2677                                 if (myPoly->mask[jx][jy][jz])
     2688                    int nx = NTERM(ix,iy,iz);
     2689                    for (int jx = ix; jx < nXterm; jx++) {
     2690                        for (int jy = (jx == ix) ? 0 : 0; jy < nYterm; jy++) {
     2691                            for (int jz = (jy == iy) ? 0 : 0; jz < nZterm; jz++) {
     2692                                if (vM[jx][jy][jz])
    26782693                                    continue;
    2679                                 int ny = jx+jy*nXterm+jz*nXterm*nYterm;
    2680                                 A->data.F64[nx][ny] += Sums[ix+jx][iy+jy][iz+jz] * wt;
     2694                                int ny = NTERM(jx,jy,jz);
     2695                                vA[nx][ny] += Sums[ix+jx][iy+jy][iz+jz] * wt;
    26812696                            }
    26822697                        }
     
    26872702    }
    26882703
     2704    // fill in upper half of matrix A
     2705    for (int nx = 0; nx < nTerm; nx++) {
     2706        for (int ny = 0; ny < nx; ny++) {
     2707            vA[nx][ny] = vA[ny][nx];
     2708        }
     2709    }
     2710
    26892711    for (int ix = 0; ix < nXterm; ix++) {
    26902712        for (int iy = 0; iy < nYterm; iy++) {
    26912713            for (int iz = 0; iz < nZterm; iz++) {
    2692                 if (!myPoly->mask[ix][iy][iz])
     2714                if (!vM[ix][iy][iz])
    26932715                    continue;
    2694                 int nx = ix+iy*nXterm+iz*nXterm*nYterm;
    2695                 B->data.F64[nx] = 0;
     2716                int nx = NTERM(ix,iy,iz);
     2717                vB[nx] = 0;
    26962718                for (int jx = 0; jx < nXterm; jx++) {
    26972719                    for (int jy = 0; jy < nYterm; jy++) {
    26982720                        for (int jz = 0; jz < nZterm; jz++) {
    2699                             int ny = jx+jy*nXterm+jz*nXterm*nYterm;
    2700                             A->data.F64[nx][ny] = (nx == ny) ? 1 : 0;
     2721                            int ny = NTERM(jx,jy,jz);
     2722                            vA[nx][ny] = (nx == ny) ? 1 : 0;
    27012723                        }
    27022724                    }
     
    27132735        for (int iy = 0; iy < nYterm; iy++) {
    27142736            for (int iz = 0; iz < nZterm; iz++) {
    2715                 int nx = ix+iy*nXterm+iz*nXterm*nYterm;
    2716                 myPoly->coeff[ix][iy][iz] = B->data.F64[nx];
    2717                 myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[nx][nx]);
     2737                int nx = NTERM(ix,iy,iz);
     2738                myPoly->coeff[ix][iy][iz] = vB[nx];
     2739                myPoly->coeffErr[ix][iy][iz] = sqrt(vA[nx][nx]);
    27182740            }
    27192741        }
     
    27822804    PS_ASSERT_VECTOR_NON_NULL(x, NULL);
    27832805    PS_ASSERT_VECTORS_SIZE_EQUAL(f, x, NULL);
     2806    PS_ASSERT_VECTOR_TYPE_F32_OR_F64(x, NULL);
    27842807    if (x->type.type != PS_TYPE_F64) {
    27852808        PS_VECTOR_GEN_F64_FROM_F32(x64, x);
     
    27932816    PS_ASSERT_VECTOR_NON_NULL(y, NULL);
    27942817    PS_ASSERT_VECTORS_SIZE_EQUAL(f, y, NULL);
     2818    PS_ASSERT_VECTOR_TYPE_F32_OR_F64(y, NULL);
    27952819    if (y->type.type != PS_TYPE_F64) {
    27962820        PS_VECTOR_GEN_F64_FROM_F32(y64, y);
     
    28042828    PS_ASSERT_VECTOR_NON_NULL(z, NULL);
    28052829    PS_ASSERT_VECTORS_SIZE_EQUAL(f, z, NULL);
     2830    PS_ASSERT_VECTOR_TYPE_F32_OR_F64(z, NULL);
    28062831    if (z->type.type != PS_TYPE_F64) {
    2807         PS_VECTOR_GEN_F64_FROM_F32(y64, z);
     2832        PS_VECTOR_GEN_F64_FROM_F32(z64, z);
    28082833    } else {
    28092834        z64 = (psVector *) z;
Note: See TracChangeset for help on using the changeset viewer.