/* File : lookup_index.c * Abstract: * * Contains a routine used by the S-function sfun_directlookup.c to * compute the index in a vector for a given data value. * * Copyright 1990-2002 The MathWorks, Inc. * $Revision: 1.7 $ */ #include "tmwtypes.h" /* * Function: GetDirectLookupIndex ============================================== * Abstract: * Using a bisection search to locate the lookup index when the x-vector * isn't evenly spaced. * * Inputs: * *x : Pointer to table, x[0] ....x[xlen-1] * xlen : Number of values in xtable * u : input value to look up * * Output: * idx : the index into the table such that: * if u is negative * x[idx] <= u < x[idx+1] * else * x[idx] < u <= x[idx+1] */ int_T GetDirectLookupIndex(const real_T *x, int_T xlen, real_T u) { int_T idx = 0; int_T bottom = 0; int_T top = xlen-1; /* * Deal with the extreme cases first: * * i] u <= x[bottom] then idx = bottom * ii] u >= x[top] then idx = top-1 * */ if (u <= x[bottom]) { return(bottom); } else if (u >= x[top]) { return(top); } /* * We have: x[bottom] < u < x[top], onward * with search for the appropriate index ... */ for (;;) { idx = (bottom + top)/2; if (u < x[idx]) { top = idx; } else if (u > x[idx+1]) { bottom = idx + 1; } else { /* * We have: x[idx] <= u <= x[idx+1], only need * to do two more checks and we have the answer */ if (u < 0) { /* * We want right continuity, i.e., * if u == x[idx+1] * then x[idx+1] <= u < x[idx+2] * else x[idx ] <= u < x[idx+1] */ return( (u == x[idx+1]) ? (idx+1) : idx); } else { /* * We want left continuity, i.e., * if u == x[idx] * then x[idx-1] < u <= x[idx ] * else x[idx ] < u <= x[idx+1] */ return( (u == x[idx]) ? (idx-1) : idx); } } } } /* end GetDirectLookupIndex */ /* [EOF] lookup_index.c */