Re: Can anyone see a faster way to compute quantities for a pair or

*To*: mathgroup at smc.vnet.net*Subject*: [mg127456] Re: Can anyone see a faster way to compute quantities for a pair or*From*: Ray Koopman <koopman at sfu.ca>*Date*: Thu, 26 Jul 2012 03:34:05 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*Delivered-to*: mathgroup-newout@smc.vnet.net*Delivered-to*: mathgroup-newsend@smc.vnet.net*References*: <juim0j$k9a$1@smc.vnet.net> <20120724081538.B3AF16802@smc.vnet.net>

On Jul 24, 11:34 pm, W Craig Carter <ccar... at MIT.EDU> wrote: > Thanks to Ray, Dan, Sseziwa, Andre, and David Park (offline response) > for their suggestions which improve computation time by about a factor > of 100. > > I am very curious what is going on under the hood that makes my original > method (pasted again below) using MapThread so inefficient compared to > the better solutions (i.e., using Apply and Map solutions not the > Compile solution). This seems a good learning--and > teaching--opportunity. > > (*original posting, the myArcTan is not the real culprit (btw, I am very > impressed with Ray's UnitStep trick*) > > (* original inefficient posted method*) > gradfield = { RandomReal[{-1, 1}, {256, 256}], RandomReal[{-1, 1}, > {256, 256}]}; > > SetAttributes[myArcTan, {Listable, NumericFunction}]; > myArcTan[0.0, 0.0] = 0.0; > myArcTan[x_, y_] := ArcTan[x, y] > > (*the angles, this is slow*) > psiField = MapThread[myArcTan, gradfield, 2]; > > (*the magnitudes, this is slower*) > magfield = MapThread[Norm[{#}] &, gradfield, 2]; > > > >> psifield2 = ArcTan@@{gradfield[[1]] + UnitStep[-magfield2], >> gradfield[[2]]} I can only speculate about why the original code is slow, but I can offer informed advice about how to keep my code running fast: gradfield must be a packed array. Also, my code for the angles can be simplified slightly, with no change in speed: psifield2 = ArcTan[gradfield[[1]] + UnitStep[-magfield2], gradfield[[2]]]

**References**:**Re: Can anyone see a faster way to compute quantities for a pair or***From:*Ray Koopman <koopman@sfu.ca>