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
