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

*To*: mathgroup at smc.vnet.net*Subject*: [mg127427] Re: Can anyone see a faster way to compute quantities for a pair or*From*: Ray Koopman <koopman at sfu.ca>*Date*: Tue, 24 Jul 2012 04:14:38 -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>

On Jul 22, 10:04 pm, W Craig Carter <ccar... at MIT.EDU> wrote: > Hello, > I am computing the gradient on a grid, then computing the gradient's > angle, and its magnitude. The computations below are the bottleneck for > a longer bit of code. I would be grateful for any insights on how to > speed these up. > > (* > Let gradfield be the gradient that I have computed and placed in two matrices. Here I will just use random numbers as a proxy: > *) > > (*i.e., df/dx, df/dy*) > gradfield = { RandomReal[{-1, 1}, {256, 256}], RandomReal[{-1, 1}, {256, 256}]}; > > (*my gradients has many zeroes, so I need to handle these*) > > 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]; > > (*examples*) > Do[psiField = MapThread[myArcTan, gradfield, 2], {100}] // Timing > Do[magfield = MapThread[Norm[{#}] &, gradfield, 2], {100}] // Timing > > W Craig Carter > Professor of Materials Science, MIT Do[magfield = MapThread[Norm[{##}]&, gradfield, 2], {100}] // Timing Do[magfield2 = Sqrt[Plus@@(gradfield^2)], {100}] // Timing Max@Abs[magfield - magfield2] {72.02 Second, Null} {2.31 Second, Null} 2.220446049250313`*^-16 Do[psifield = MapThread[myArcTan, gradfield, 2], {100}] // Timing Do[psifield2 = ArcTan@@{gradfield[[1]], gradfield[[2]] + UnitStep[-magfield2]}, {100}] // Timing Max@Abs[psifield - psifield2] {56.07 Second, Null} {2.56 Second, Null} 0.