I have been trying to improve an old algorithm for creating trapezoid shaped fuzzy set membership functions using I., but problems have arisen.
The idea is to supply a left argument to the verb `trap` that corresponds to the ordered values aa<:bb<:cc<:dd, which correspond to the x-ordinate of each of the 4 (x,y) corners of the trapezoid in the following picture, and a right argument to `trap` that specifies a list of sample points on the x axis. The resulting output of `trap` should be the shape of the right hand argument, as follows (unfortunately in this case the right hand argument is the x values on the graph, which we normally refer to as the y value of a verb). [Case 0] 0, when x < aa, or when x>dd [Case 1] 1, when bb < x < cc [Case 2] a linear interpolation between 0 and 1 or between 1 and 0, where the order 0 to 1 applies when aa<x<bb and the order 1 to 0 when cc<x<dd NB. ______ y=1 NB. / \ NB. / \ NB. _/ \____ y=0 NB. aa bb cc dd NB. So for example, the fictional inputs and results should be like these. 2 6 8 10 trap i. 11 0 0 0 0.25 0.5 0.75 1 1 1 0.5 0 2 6 8 8 trap i. 11 0 0 0 0.25 0.5 0.75 1 1 1 0 0 6 6 8 10 trap i. 11 0 0 0 0 0 0 1 1 1 0.5 0 What I have so far is two different versions of `trap`: trap2 and trap3 which can be combined into trap, but I am not happy with the inefficiency of this trap and am looking for suggestions. Idotr =: |....@[ (#...@[-i.) ] NB. reverses direction of I. ntr =: interpolate =: ({...@[-])%-/@(2&{.)@[ trap2 =: (0:`ntr`1:`(|....@[ntr])`0:@.I. )"1 0 trap3 =: (0:`ntr`1:`(|....@[ntr])`0:@.Idotr)"1 0 trap =: trap2>.trap3 Thank you, -- (B=) ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm