Hi Michal,

You could replace  (2&^)@:# with (2^#) to be a little more readable.

 L2a=: _2((#:@:i.@:(2^#)) (+./"2 @: (*."0 1"1 _)) ])\y

Cheers, bob

> On Oct 12, 2016, at 9:14 AM, Michal Dobrogost <michal.dobrog...@gmail.com> 
> wrote:
> 
> Hi All,
> 
> I've been mucking around generating look up tables in C++. Getting
> frustrated, I wrote up this J single liner. Can you think of ways to
> simplify the LUT computation (the expression we assign to L2 and L3 below)?
> 
> *Original Operator (no LUT)*
> 
>   ] x =. ? 5 $ 2
> 1 0 1 1 0
>   ] y =. 30 > ? 5 6 $ 100
> 1 0 0 0 0 0
> 0 1 0 1 1 0
> 0 1 0 0 0 1
> 0 0 0 0 1 1
> 0 1 1 1 0 1
>   x (+./@:*.) y
> 1 1 0 0 1 1
> 
> *LUT Explanation*
> 
> The idea is to break up x into smaller chunks (2-bits, 3-bits, etc) and
> precompute the operation for the corresponding chunks of y. Then we just
> convert the chunks into indices and look them up in the LUT.
> 
>   _2<\x
> ┌───┬───┬─┐
> │1 0│1 1│0│
> └───┴───┴─┘
>   _2#.\x
> 2 3 0
> 
> *2-bit LUT*
> 
>   ]L2=. _2((#:@:i.@:(2&^)@:#) (+./"2 @: (*."0 1"1 _)) ])\y
> 0 0 0 0 0 0
> 0 1 0 1 1 0
> 1 0 0 0 0 0
> 1 1 0 1 1 0
> 
> 0 0 0 0 0 0
> 0 0 0 0 1 1
> 0 1 0 0 0 1
> 0 1 0 0 1 1
> 
> 0 0 0 0 0 0
> 0 1 1 1 0 1
> 0 0 0 0 0 0
> 0 0 0 0 0 0
> 
>   +./ (_2#.\x) {"0 2 L2    NB. Compute by 2-bit lookups
> 1 1 0 0 1 1
> 
> *3-Bit LUT*
> 
>   ]L3=. _3((#:@:i.@:(2&^)@:#) (+./"2 @: (*."0 1"1 _)) ])\y
> 0 0 0 0 0 0
> 0 1 0 0 0 1
> 0 1 0 1 1 0
> 0 1 0 1 1 1
> 1 0 0 0 0 0
> 1 1 0 0 0 1
> 1 1 0 1 1 0
> 1 1 0 1 1 1
> 
> 0 0 0 0 0 0
> 0 1 1 1 0 1
> 0 0 0 0 1 1
> 0 1 1 1 1 1
> 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0
> 
>   +./ (_3#.\x) {"0 2 L3    NB. Compute by 3-bit lookups
> 1 1 0 0 1 1
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

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

Reply via email to