On Thu, Sep 29, 2011 at 6:18 AM, Raul Miller <[email protected]> wrote:
> On Wed, Sep 28, 2011 at 10:44 PM, Lettow, Kenneth <[email protected]> 
> wrote:
>>   sa=: 1 2 5 9
> ...
>>   NB. nearest value in sa.  The desired result should be:
>>   desiredresult=: 1 1 2 2 5 5 5 5 9 9
>
> Here's a brute force approach:
>
>   ({."1 {~ |: i."_1 <./)@:|@(-/ 1 i.@+ >./) 1 2 5 9
> 1 1 2 2 5 5 5 5 9 9


Here's a version that relies on the data being ordered:

inds=: [: i. 1 + {:
poss=: (,{.) {~ _1 0 +/ ] I. inds
nearVal=: |:@poss {~"_1 [: (|: i."_1 <./) inds |@-"1 poss

   nearVal 1 2 5 9
1 1 2 2 5 5 5 5 9 9

Or, an explicit version (which, in effect, caches the function results
within an execution):

nearVal=:3 :0
  inds=. i. 1 + {: y
  poss=. (y,{.y) {~ 0 _1 +/ y I. inds
  (|:poss) {~"_1 (|: i."_1 <./) |inds -"1 poss
)

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to