I'm not quite sure I understand what you are doing here. Here's what I understand from your description:
You're looking for rows where a bit set in X has a bit set in Y, and you want to split up X and Y into smaller pieces for your intermediate result, and you want to use indices rather than bit operations for your final operation. That gives me something like this. X =: ? 5 $ 2 Y =: 30 > ? 5 6 $ 100 X 0 1 1 1 1 Y 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 (_2 {. X) inds _2 {. Y 0 3 5 (3 {. X) inds 3 {. Y 0 1 2 5 0 3 5 ([ -. -.) 0 1 2 5 0 5 So maybe you would be looking at making an adverb along the lines of: L=: adverb define : (m {. x) inds m {. y ) Or, more concisely: L=: adverb define inds&(m&{.) ) But when I look at your calculations, I don't see anything like this. If I am off base here, could you describe how what you are looking for differs from what I am understanding? Thanks, -- Raul On Wed, Oct 12, 2016 at 12:14 PM, 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