View Raw SPL
/*****************************************************************************
*                                                                            *
*   FINDVAL.SPL   Copyright (C) 1999 DSP Development Corporation             *
*                               All Rights Reserved                          *
*                                                                            *
*   Author:       Randy Race                                                 *
*                                                                            *
*   Synopsis:     Finds X and Y values in a series                           *
*                                                                            *
*   Revisions:    15 Jun 1999  RRR  Creation                                 *
*                                                                            *
*****************************************************************************/


#if @HELP_FINDVAL

    FINDVAL

    Purpose: Returns X and Y values of a series from a specified Y value

    Syntax:  FINDVAL(s, val)

             s   - a series or array

             val - real or series, values to search


    Returns: An XY series or separate scalars:

             b = findval(s, val)

             returns an XY series


             (x, y) = findval(s, val)

             returns the X and Y values as separate scalars



    Example:
             a = {1, 12, 0, 5};
             b = findval(a, 0);
             (x, y) = findval(a, 0);

             b == xy({2}, {0})
             x == 2.0
             y == 0.0


    Example:
             W1: gnorm(100,.1):overp(findval(curr,max),lred);setsym(CIRCLE,2)

             marks the max of W1 with a red circle

    Remarks:
             Findval returns an XY series with the same units as the
             input series. Multiple x values can be returned if val occurs
             multiple times in the series


             (x, y) = findval(s, val) returns the first occurance of val in s.

    See Also:
             Find
             Findmax
             Findmin

#endif


/* find a specific value in a series */
findval(s, val)
{
        local idx, x, vxy, rval;

        if (argc < 2)
        {
                error("findval - input series and value required");
        }

        /* make sure val is a scalar */
        val = castreal(val);

        /* idx value */
        idx = find(s == val);

        /* convert to xvalue */
        x = xoffset(s) + (idx - 1) * deltax(s);

        if (outargc < 2)
        {
                /* return as XY series */
                vxy = xy( {x}, s[idx]);
                
                /* set units */
                sethunits(vxy, gethunits(s));
                setvunits(vxy, getvunits(s));
                return(vxy);
        }
        else
        {
                /* return separate x y values as scalars */
                return(x[1], val);
        }
}