I time it at 50x faster:

julia> @time slicefun(A);
elapsed time: 1.135524683 seconds (181765472 bytes allocated)

julia> @time ismaxfun(A);
elapsed time: 0.020300699 seconds (931120 bytes allocated)


Did you run it a second time? (You don't want to include the JIT timing.)

--Tim

On Wednesday, April 30, 2014 07:38:07 AM Florian Oswald wrote:
> I see. thanks!
> you are (of course) right with the timing:
> 
> julia> function slicefun(x::Array{Float64,6})
>        z = mapslices(findmax,x,6)
>        end
> julia> function ismaxfun(x::Array{Float64,6})
>        z = maximum(x,6)
>        ismax = x .== z
>        end
> 
> times as follows. more than twice as fast!
> 
> julia> @time k = ismaxfun(A)
> elapsed time: 0.53359244 seconds (14418060 bytes allocated)
> julia> @time k = slicefun(A)
> elapsed time: 1.396534023 seconds (226762376 bytes allocated)
> 
> On Wednesday, 30 April 2014 15:25:25 UTC+1, Tim Holy wrote:
> > There is
> > 
> >     maximum(A, 3)
> > 
> > but I gather you also want the index? If so, mapslices is your best
> > one-liner
> > as of now. But if you're performance-sensitive, you might also look into
> > 
> > this:
> >     M = maximum(A, dims)
> >     ismax = A .== M
> > 
> > and then find the `true` elements of ismax. I'll bet that's quite a lot
> > faster
> > than using mapslices, even though it requires two traversals of the array.
> > As
> > a bonus, you'll also learn about ties.
> > 
> > --Tim
> > 
> > On Wednesday, April 30, 2014 04:04:47 AM Florian Oswald wrote:
> > > I looked at the issue open at
> > > 
> > > https://github.com/JuliaLang/julia/issues/3893
> > > 
> > > but couldn't figure out what's the best thing to do. I gather that there
> > > will be a
> > > 
> > > findmax(A,dims)
> > > 
> > > in some future version of julia? that's certainly what im looking for
> > 
> > here.
> > 
> > > in the meantime, is this the best I can do?
> > > 
> > > A = randn(3,3,3)
> > > mapslices(findmax,A,3)
> > > 
> > > cheers

Reply via email to