Sorry I missed that suggestion.

You are correct,

>,"1&.>/ ,&.>/ IsMax

works as well as

  10 10 $ , > |:"2  <"1 > IsMax

and I would call that more elegant, and slightly shorter. Also I like that it 
doesn't need to reshape($).

Thanks!

--------------------------------------------
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:45 PM
 
 Did you notice my last
 line ?  It specifically gave you an alternative way to
 unbox the cells you had in IsMax preserving row/column
 indexes.
 
 Unfortunately it
 became “line broken” in email, but you can stitch and
 try … sending again (with spaces if that avoids the line
 breaking)…
 
 Treat the
 following line of chars (even if multiple lines) as one line
 (you may also have to change the “ to the J form (just
 retype this character after you copy/paste the line) …
 this works likewise for the 3x3 cells…/Rob
    > ,”1 &. > / , &.
 > / IsMax
 
 
 
 
 > On 29
 Mar 2017, at 8:38 pm, '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

Reply via email to