I agree, it is very elegant.

I was just amidst a reply to you to say same … the approach using (2 2$n) fn ;. 
3 is very nice and avoids carrying around the boxed sub results at all…/Regards 
Rob


> On 31 Mar 2017, at 12:44 pm, 'Jon Hough' via Programming 
> <[email protected]> wrote:
> 
> Thanks Raul, your solution is much nicer than mine.
> 
> 
> --------------------------------------------
> On Wed, 3/29/17, Raul Miller <[email protected]> wrote:
> 
> Subject: Re: [Jprogramming] Unboxing after subarray function
> To: "Programming forum" <[email protected]>
> Date: Wednesday, March 29, 2017, 9:01 PM
> 
> Here's a
> generalization which works on your first example (which
> happens to also be a better example):
> 
> maxes=: [ # [ #"1 (2 2 $
> [) >./@,;.3 ]
> 
>    T =: 10 10 $ 0 _2 12 100 2 4.5 1
> 7 _5.5 3.2 120 2 _100 3 5 18 4
>    2 maxes T
> 120 120
> 100 100  18  18   7   7  12  12
> 120 120 100 100  18 
> 18   7   7  12  12
> 100 100  18  18   7   7
> 120 120 4.5 4.5
> 100 100  18 
> 18   7   7 120 120 4.5 4.5
>   7   7  12  12 120 120 4.5 4.5 
> 18  18
>   7   7  12  12 120
> 120 4.5 4.5  18  18
> 120 120 4.5
> 4.5   7   7  18  18 120 120
> 120 120 4.5 4.5   7   7 
> 18  18 120 120
> 4.5 4.5  18  18 120 120 
> 12  12 100 100
> 4.5 4.5  18  18 120 120 
> 12  12 100 100
>    2 (]=maxes)
> T
> 0 0 0 1 0 0 0 1 0 0
> 1 0 0
> 0 0 1 0 0 0 1
> 1 0 0 0 1 0 0 1 0 0
> 0 0 1 0 0 0 0 0 0 1
> 0 1 0 0 1 0
> 0 0 0 1
> 0 0 0 1 0 0 1 0 0 0
> 0 1 0 0 0 0 1 0 0 0
> 0 0 0 1 0 1
> 0 0 1 0
> 0 0 0 1 0 0 0 1 1 0
> 1 0 0 0 0 1 0 0 0 0
> 
> Thanks,
> 
> -- 
> Raul
> 
> 
> On
> Wed, Mar 29, 2017 at 5:46 AM, Raul Miller <[email protected]>
> wrote:
>>     maxes=: 3#3#"1 (2 2$3)
>> ./@,;.3 ]
>>     maxes T
>> 200 200 200 200 200 200
>> 200 200 200 200 200 200
>> 200 200 200 200 200 200
>> 200 200 200 200 200 200
>> 200 200 200 200 200 200
>> 200 200 200 200 200 200
>>     (= maxes) T
>> 0 0
> 0 0 0 0
>> 0 0 1 0 0 0
>> 0 0 0 0 0 1
>> 0 0 0 0 0
> 0
>> 0 0 1 0 0 0
>> 0 0
> 0 0 0 1
>> 
>> Like
> that?
>> 
>> Thanks,
>> 
>> --
>> Raul
>> 
>> 
>> On Wed, Mar 29, 2017
> at 5:38 AM, 'Jon Hough' via Programming
>> <[email protected]>
> wrote:
>>> Yes, the "stride"
> of each window is equal to its length, so in this case using
> ;.3 (with appropriate arguments) gives the same result as
> ;.1 .
>>> Regardless, my problem occurs
> after this part, I think. The problem is trying to unbox the
> boxed array, keeping the correct shape and element
> positions.
>>> If there is a way to do
> this without using ;. that would also be great.
>>> 
>>> Just to
> reiterate, given an NxN array, T say, create a second NxN
> array, S say, such that the elements of S are either 1 or 0,
> depending on whether they are equal to the appropriate MxM
> subarray's max element, where M divides N. Sorry, that
> is a pretty ugly definition of the problem.
>>> 
>>> Here's
> another example (using ;.3):
>>> 
>>>     ]T =: 6 6 $ 1 4 100 0 4 3 8 5
> 200
>>> 1 4 100 0 4   3
>>> 8 5 200 1 4 100
>>> 0 4   3 8 5 200
>>> 1 4 100 0 4   3
>>> 8 5 200 1 4 100
>>> 0 4   3 8 5 200
>>> 
>>> c =: ;.3
>>>     (2 2 $ 3 3 3 3) ((>./ =
> ])&.>@:<)c T NB. window has size 3x3 and stride
> 3x3, so creates 4 3x3 boxes
>>> 
>>> 
>>> 
> ┌─────┬─────┐
>>> │0 0 0│0 0 0│
>>> │0 1 0│0 0 0│
>>> │0 0 0│0 0 1│
>>> 
> ├─────┼─────┤
>>> │0 0 0│0 0 0│
>>> │0 1 0│0 0 0│
>>> │0 0 0│0 0 1│
>>> 
> └─────┴─────┘
>>> 
>>> So, the
> problem is to get rid of the boxes, but keep the shape and
> positions of the array and its elements.
>>> 
>>> 
> --------------------------------------------
>>> On Wed, 3/29/17, Rob Hodgkinson <[email protected]>
> wrote:
>>> 
>>>  
> Subject: Re: [Jprogramming] Unboxing after subarray
> function
>>>   To: [email protected]
>>>   Date: Wednesday, March 29, 2017,
> 6:19 PM
>>> 
>>>  
> Jon, I note Henry’s
>>>   point about
> using <;.3 T if you wish to use the 2x2
>>>   tessellation windows as per
> Henry’s suggestion, that is
>>>  
> fine.  (it was my first approach on reading your
> question
>>>   too).
>>> 
>>>   But I
> notice you are
>>>   choosing to
> “slice” separate subarrays (non overlapping)
>>>   so I gather your question is a
> neater way to reconstruct
>>>   IsMax
> as a simple 10 10 array ?  If so, you gave this:
>>>       10 10 $ , > |:"2 
> <"1
>>>   > IsMax
>>> 
>>>   Then my
>>>   suggestion is this (which reproduces
> your final line
>>>   only):
>>>       >,"1&.>/
>>>   ,&.>/ IsMax
>>> 
>>>   HTH,
>>>   Regards Rob
>>> 
>>> 
>>>   > On 29 Mar 2017, at 6:54 pm,
> 'Jon
>>>   Hough' via
> Programming <[email protected]>
>>>   wrote:
>>>  
>> 
>>>   > I should
>>>   also mention that my verb(s) work
> for subarrays other than
>>>   2x2.
>>>   > e.g. if T is a 12x12 array
>>>   > T =: 12 12 $ 0 _2 12 100 2 4.5
> 1 7 _5.5
>>>   3.2 120 2 _100 3 5 18
> 4
>>>   > is =:  12 $ 1
>>>   0 0
>>>   >
> IsMax =:
>>>  
> (is;is)   ($$((>./=])@:,))&.>@:<
>>>   interval T  NB. max of 3x3
> subarrays
>>>   >
>>>   12 12 $ , > |:"2 
> <"1 > IsMax
>>>   >
>>>   > Also creates the
>>>   correct array.
>>>   >
>>>  
>> 
>>>  
> --------------------------------------------
>>>   > On Wed, 3/29/17, 'Jon
> Hough' via
>>>   Programming <[email protected]>
>>>   wrote:
>>>  
>> 
>>>   > Subject:
>>>   [Jprogramming] Unboxing after
> subarray function
>>>   > To:
> "Programming Forum" <[email protected]>
>>>   > Date: Wednesday, March 29,
> 2017, 4:38
>>>   PM
>>>   >
>>>   >
> I have a NxN
>>>   matrix.
>>>   > For each 2x2 subarray of
> this
>>>   (keep it simple, N is even),
> I
>>>   > want to
>>>   calculate the maximum value and if
> the value of that
>>>   > cell
> equals the maximum of the 2x2
>>>  
> subarray write 1, else
>>>   > write
> 0.
>>>   >
>>>   > e.g.
>>>  
>> NB. T arbitrary 10x10 matrix
>>>  
>> T =: 10 10 $ 0 _2 12 100 2 4.5 1 7 _5.5
>>>   3.2 120 2 _100 3 5
>>>   > 18 4
>>>  
>> 
>>>   > interval =: ;.1
>>>   > is =:  10 $ 1 0
>>>   >
>>>  
>>   IsMax =:
>>>   >
>>>  
> (is;is)   ($$((>./=])@:,))&.>@:<
>>>   > interval T
>>>   >
>>>   >
> So IsMax shows which elements are the max
>>>   values of the 4x4
>>>   > subarrays.
>>>   >
>>>   >
> Now I want to unbox
>>>   and keep the
> indices correct.
>>>   >
>>>   > This appears to work
>>>   >
>>> 
>>>   > 10 10 $ , > |:"2 
> <"1
>>>   > IsMax
>>>   >
>>>   >
> But is
>>>   incredibly messy. I'm
> hoping there is a nicer/ more
>>>  
>> terse / elegant way to do this.
>>>   >
>>>   >
> Thanks,
>>>   > Jon
>>>   >
>>>  
> ----------------------------------------------------------------------
>>>   > For information about J forums
> see http://www.jsoftware.com/forums.htm
>>>   >
>>>  
> ----------------------------------------------------------------------
>>>   > For information about J forums
> see http://www.jsoftware.com/forums.htm
>>> 
>>>  
> ----------------------------------------------------------------------
>>>   For information about J forums see
> http://www.jsoftware.com/forums.htm
>>> 
> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> 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