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