May be it's not really the type of solution you have in mind, but I'll give it a try.
If the domain of the args is i.n , then this is more efficient for: LHA with 'large' gaps, and 10 ( much < ) # RHA trap17=: 4 : 0 'u h d' =. 2 -~/\ x 'lz dr' =. 0 >. x (-&{.,-~&{.) y (#y){. dr}. (lz$0), ((%*i.)u), (1$~h+1), (%...@-)d ) 200 400 480 600 (trap-:trap17) i.1e3 1 5 ts '200 400 480 600 trap i.1e3' 0.0083002 219776 5 ts '200 400 480 600 trap17 i.1e3' 8.74e_5 45696 6j2 ": 0.0083002 219776 % 8.74e_5 45696 94.97 4.81 Hallo Brian Schott, je schreef op 27-04-09 06:50: > 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 > > > -- =@@i ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm