IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 4, 2021, 6:02:11 PM (5 years ago)
Author:
eugene
Message:

merge changes from eam_branches/ipp-dev-20210817 (add chebyshev, add fit2d_full, add inner_fraction to medimage, change dvoImageOverlap test to CERSTD)

Location:
trunk/Ohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana

  • trunk/Ohana/src/opihi/cmd.data/applyfit2d.c

    r29001 r41891  
    116116
    117117
     118int applyfit2d_full (int argc, char **argv) {
     119 
     120  int i, j, n, order;
     121  char *c, name[64];
     122  double **C, X, Y;
     123  opihi_flt *z;
     124  Vector *xvec, *yvec, *zvec;
     125
     126  if (argc != 4) {
     127    gprint (GP_ERR, "USAGE: applyfit2d_full x y z\n");
     128    return (FALSE);
     129  }
     130
     131  c = get_variable ("Cnn");
     132  if (c == NULL) {
     133    gprint (GP_ERR, "no fit available\n");
     134    return (FALSE);
     135  }
     136  order = atof (c);
     137  free (c);
     138
     139  if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);   
     140  if ((yvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);   
     141  if ((zvec = SelectVector (argv[3], ANYVECTOR, TRUE)) == NULL) return (FALSE);   
     142
     143  ALLOCATE (C, double *, order+1);
     144  for (i = 0; i <= order; i++) {
     145    ALLOCATE (C[i], double, order+1);
     146    for (j = 0; j <= order; j++) {
     147      sprintf (name, "CX%dY%d", i, j);
     148      c = get_variable (name);
     149      if (c == NULL) {
     150        gprint (GP_ERR, "missing fit term %d,%d\n", i, j);
     151        for (j = 0; j < i; j++) free (C[j]);
     152        free (C);
     153        return (FALSE);
     154      }
     155      C[i][j] = atof (c);
     156      free (c);
     157    }
     158  }
     159
     160  ResetVector (zvec, OPIHI_FLT, xvec[0].Nelements);
     161  bzero (zvec[0].elements.Flt, sizeof(opihi_flt)*zvec[0].Nelements);
     162  z = zvec[0].elements.Flt;
     163
     164  // we have four cases (x == flt or int) and (y == flt or int)
     165  if ((xvec[0].type == OPIHI_FLT) && (yvec[0].type == OPIHI_FLT)) {
     166    opihi_flt *x = xvec[0].elements.Flt;
     167    opihi_flt *y = yvec[0].elements.Flt;
     168    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
     169      Y = X = 1;
     170      for (j = 0; j <= order; j++) {
     171        X = Y;
     172        for (i = 0; i <= order; i++) {
     173          *z += C[i][j]*X;
     174          X = X * (*x);
     175        }
     176        Y = Y * (*y);
     177      }
     178    }
     179  }
     180  if ((xvec[0].type == OPIHI_FLT) && (yvec[0].type == OPIHI_INT)) {
     181    opihi_flt *x = xvec[0].elements.Flt;
     182    opihi_int *y = yvec[0].elements.Int;
     183    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
     184      Y = X = 1;
     185      for (j = 0; j <= order; j++) {
     186        X = Y;
     187        for (i = 0; i <= order; i++) {
     188          *z += C[i][j]*X;
     189          X = X * (*x);
     190        }
     191        Y = Y * (*y);
     192      }
     193    }
     194  }
     195  if ((xvec[0].type == OPIHI_INT) && (yvec[0].type == OPIHI_FLT)) {
     196    opihi_int *x = xvec[0].elements.Int;
     197    opihi_flt *y = yvec[0].elements.Flt;
     198    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
     199      Y = X = 1;
     200      for (j = 0; j <= order; j++) {
     201        X = Y;
     202        for (i = 0; i <= order; i++) {
     203          *z += C[i][j]*X;
     204          X = X * (*x);
     205        }
     206        Y = Y * (*y);
     207      }
     208    }
     209  }
     210  if ((xvec[0].type == OPIHI_INT) && (yvec[0].type == OPIHI_INT)) {
     211    opihi_int *x = xvec[0].elements.Int;
     212    opihi_int *y = yvec[0].elements.Int;
     213    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
     214      Y = X = 1;
     215      for (j = 0; j <= order; j++) {
     216        X = Y;
     217        for (i = 0; i <= order; i++) {
     218          *z += C[i][j]*X;
     219          X = X * (*x);
     220        }
     221        Y = Y * (*y);
     222      }
     223    }
     224  }
     225
     226  for (i = 0; i < order + 1; i++) free (C[i]);
     227  free (C);
     228
     229  return (TRUE);
     230}
     231
     232
Note: See TracChangeset for help on using the changeset viewer.