The way to do this efficiently and generally is to use generated functions
<http://docs.julialang.org/en/latest/manual/metaprogramming/#generated-functions>.
You can generate specialized versions of this functionality for each
dimensionality of array and shape of slice.

On Tue, Aug 11, 2015 at 2:28 PM, Tim Holy <[email protected]> wrote:

> If you don't care about performance, the generalization of your method is
> `mapslices`.
>
> If you do care about performance and you're running Julia 0.4,
> check out the Cartesian iterators:
> http://docs.julialang.org/en/latest/manual/arrays/#iteration
>
> Something like:
>
>     for I in CartesianRange(Istart, Iend)
>         Acurrent = A[I]
>         for d = 1:N
>             counter[d] += Acurrent >= A[I-offset[d]]
>         end
>     end
>
> where offset[d] is a vector of CartesianIndexes that look like
> (0,0,1,0,0,...)
> (1 is in the dth slot).
>
> Best,
> --Tim
>
>
> On Tuesday, August 11, 2015 09:50:07 AM Nils Gudat wrote:
> > This is a re-post of sorts of a question I already asked a year ago in
> the
> > user group. At the time, Stefan Karpinski proposed that base.issorted
> might
> > be expanded to accomodate checking in multiple dimensions, but looking at
> > the docs it seems this hasn't happened. This post now has two purposes:
> > 1. To ask if anyone knows of such a functionality, maybe in a package?
> > 2. To see if someone has an idea about how to improve my approach. I'm
> > basically doing this:
> >
> > function checkmonotonicity(v::Array{Float64,2})
> >   counter = zeros(2)
> >
> >   for b = 1:size(v,2)
> >     counter[1] += ~issorted(v[:, b])
> >   end
> >
> >   for a = 1:size(v,1)
> >     counter[2] += ~issorted(v[a, :])
> >   end
> >
> >   return counter
> > end
> >
> > which for three dimensions requires me to write:
> >
> > function checkmonotonicity(v::Array{Float64,3})
> >   counter = zeros(3)
> >
> >   for c = 1:size(v,3), b = 1:size(v,2)
> >     counter[1] += ~issorted(v[:, b, c])
> >   end
> >
> >   for c = 1:size(v,3), a = 1:size(v,1)
> >     counter[2] += ~issorted(v[a, :, c])
> >   end
> >
> >   for b = 1:size(v,2), a = 1:size(v,1)
> >     counter[3] += ~issorted(v[a, b, :])
> >   end
> >
> >   return counter
> > end
> >
> > and so on for higher dimensions. Obviously, this quickly gets cumbersome
> > for higher dimensions, so I wanted to see if anyone could recommend a
> smart
> > way of doing this (maybe via metaprogramming?).
> >
> > (For context, I'm actually interested in the number of monotonicity
> > violations, which is why I count them rather than just breaking at the
> > first violation in a given dimension. This isn't too important, so if
> > there's an existing function that simply returns a Boolean for each
> > dimension, I'm happy with that.)
>
>

Reply via email to