IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 15, 2023, 4:56:54 AM (3 years ago)
Author:
eugene
Message:

adding psPolynomial1DCopy, psPolynomial1DRecycle; working on the polynomial IRLS fitting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20230313/psLib/src/math/psPolynomial.c

    r41896 r42492  
    806806}
    807807
    808 // XXX add 1D, 3D, 4D versions
    809 bool psPolynomial2DRecycle(psPolynomial2D *poly,
    810                            psPolynomialType type,
    811                            unsigned int nX,
    812                            unsigned int nY)
    813 {
    814     PS_ASSERT_INT_NONNEGATIVE(nX, NULL);
    815     PS_ASSERT_INT_NONNEGATIVE(nY, NULL);
    816 
    817     bool match = true;
    818     match &= (poly->type == type);
    819     match &= (poly->nX == type);
    820     match &= (poly->nY == type);
    821 
    822     if (!match) {
    823         for (int i = 0; i < poly->nX + 1; i++) {
    824             psFree (poly->coeff[i]);
    825             psFree (poly->coeffErr[i]);
    826             psFree (poly->coeffMask[i]);
    827         }
    828         psFree (poly->coeff);
    829         psFree (poly->coeffErr);
    830         psFree (poly->coeffMask);
    831 
    832         poly->type = type;
    833         poly->nX = nX;
    834         poly->nY = nY;
    835 
    836         poly->coeff = psAlloc((1 + nX) * sizeof(psF64 *));
    837         poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64 *));
    838         poly->coeffMask = (psMaskType **)psAlloc((1 + nX) * sizeof(psMaskType *));
    839         for (int i = 0; i < (1 + nX); i++) {
    840             poly->coeff[i] = psAlloc((1 + nY) * sizeof(psF64));
    841             poly->coeffErr[i] = psAlloc((1 + nY) * sizeof(psF64));
    842             poly->coeffMask[i] = (psMaskType *)psAlloc((1 + nY) * sizeof(psMaskType));
    843         }
    844     }
    845     for (int i = 0; i < (1 + nX); i++) {
    846         for (int j = 0; j < (1 + nY); j++) {
    847             poly->coeff[i][j] = 0.0;
    848             poly->coeffErr[i][j] = 0.0;
    849             poly->coeffMask[i][j] = PS_POLY_MASK_NONE;
    850         }
    851     }
    852     return(true);
    853 }
    854 
    855 // XXX add 1D, 3D, 4D versions
    856 psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out,
    857                                    psPolynomial2D *poly)
    858 {
    859     if (out == NULL) {
    860         out = psPolynomial2DAlloc (poly->type, poly->nX, poly->nY);
    861     } else {
    862         psPolynomial2DRecycle (out, poly->type, poly->nX, poly->nY);
    863     }
    864 
    865     for (int i = 0; i < (1 + poly->nX); i++) {
    866         for (int j = 0; j < (1 + poly->nY); j++) {
    867             out->coeff[i][j] = poly->coeff[i][j];
    868             out->coeffErr[i][j] = poly->coeffErr[i][j];
    869             out->coeffMask[i][j] = poly->coeffMask[i][j];
    870         }
    871     }
    872     return(out);
    873 }
    874 
    875808psPolynomial3D* psPolynomial3DAlloc(
    876809    psPolynomialType type,
     
    1002935}
    1003936
     937// XXX add 3D, 4D versions
     938bool psPolynomial1DRecycle(psPolynomial1D *poly,
     939                           psPolynomialType type,
     940                           unsigned int nX)
     941{
     942    PS_ASSERT_INT_NONNEGATIVE(nX, NULL);
     943
     944    bool match = true;
     945    match &= (poly->type == type);
     946    match &= (poly->nX == type);
     947
     948    if (!match) {
     949        psFree (poly->coeff);
     950        psFree (poly->coeffErr);
     951        psFree (poly->coeffMask);
     952
     953        poly->type = type;
     954        poly->nX = nX;
     955
     956        poly->coeff = psAlloc((1 + nX) * sizeof(psF64));
     957        poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64));
     958        poly->coeffMask = (psMaskType *)psAlloc((1 + nX) * sizeof(psMaskType));
     959    }
     960    for (int i = 0; i < (1 + nX); i++) {
     961        poly->coeff[i] = 0.0;
     962        poly->coeffErr[i] = 0.0;
     963        poly->coeffMask[i] = PS_POLY_MASK_NONE;
     964    }
     965    return(true);
     966}
     967
     968bool psPolynomial2DRecycle(psPolynomial2D *poly,
     969                           psPolynomialType type,
     970                           unsigned int nX,
     971                           unsigned int nY)
     972{
     973    PS_ASSERT_INT_NONNEGATIVE(nX, NULL);
     974    PS_ASSERT_INT_NONNEGATIVE(nY, NULL);
     975
     976    bool match = true;
     977    match &= (poly->type == type);
     978    match &= (poly->nX == type);
     979    match &= (poly->nY == type);
     980
     981    if (!match) {
     982        for (int i = 0; i < poly->nX + 1; i++) {
     983            psFree (poly->coeff[i]);
     984            psFree (poly->coeffErr[i]);
     985            psFree (poly->coeffMask[i]);
     986        }
     987        psFree (poly->coeff);
     988        psFree (poly->coeffErr);
     989        psFree (poly->coeffMask);
     990
     991        poly->type = type;
     992        poly->nX = nX;
     993        poly->nY = nY;
     994
     995        poly->coeff = psAlloc((1 + nX) * sizeof(psF64 *));
     996        poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64 *));
     997        poly->coeffMask = (psMaskType **)psAlloc((1 + nX) * sizeof(psMaskType *));
     998        for (int i = 0; i < (1 + nX); i++) {
     999            poly->coeff[i] = psAlloc((1 + nY) * sizeof(psF64));
     1000            poly->coeffErr[i] = psAlloc((1 + nY) * sizeof(psF64));
     1001            poly->coeffMask[i] = (psMaskType *)psAlloc((1 + nY) * sizeof(psMaskType));
     1002        }
     1003    }
     1004    for (int i = 0; i < (1 + nX); i++) {
     1005        for (int j = 0; j < (1 + nY); j++) {
     1006            poly->coeff[i][j] = 0.0;
     1007            poly->coeffErr[i][j] = 0.0;
     1008            poly->coeffMask[i][j] = PS_POLY_MASK_NONE;
     1009        }
     1010    }
     1011    return(true);
     1012}
     1013
     1014// XXX 3D, 4D versions
     1015psPolynomial1D *psPolynomial1DCopy(psPolynomial1D *out,
     1016                                   psPolynomial1D *poly)
     1017{
     1018    if (out == NULL) {
     1019        out = psPolynomial1DAlloc (poly->type, poly->nX);
     1020    } else {
     1021        psPolynomial1DRecycle (out, poly->type, poly->nX);
     1022    }
     1023
     1024    for (int i = 0; i < (1 + poly->nX); i++) {
     1025        out->coeff[i] = poly->coeff[i];
     1026        out->coeffErr[i] = poly->coeffErr[i];
     1027        out->coeffMask[i] = poly->coeffMask[i];
     1028    }
     1029    return(out);
     1030}
     1031psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out,
     1032                                   psPolynomial2D *poly)
     1033{
     1034    if (out == NULL) {
     1035        out = psPolynomial2DAlloc (poly->type, poly->nX, poly->nY);
     1036    } else {
     1037        psPolynomial2DRecycle (out, poly->type, poly->nX, poly->nY);
     1038    }
     1039
     1040    for (int i = 0; i < (1 + poly->nX); i++) {
     1041        for (int j = 0; j < (1 + poly->nY); j++) {
     1042            out->coeff[i][j] = poly->coeff[i][j];
     1043            out->coeffErr[i][j] = poly->coeffErr[i][j];
     1044            out->coeffMask[i][j] = poly->coeffMask[i][j];
     1045        }
     1046    }
     1047    return(out);
     1048}
     1049
    10041050/* note these functions accept unscaled values and apply the scaling saved on poly */
    10051051psF64 psPolynomial1DEval(const psPolynomial1D* poly,
Note: See TracChangeset for help on using the changeset viewer.