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.