MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Plotting Speed: Plot and other functions not

  • To: mathgroup at smc.vnet.net
  • Subject: [mg102366] Re: [mg102352] Plotting Speed: Plot and other functions not
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Fri, 7 Aug 2009 05:28:37 -0400 (EDT)
  • References: <200908061032.GAA01807@smc.vnet.net>
  • Reply-to: drmajorbob at bigfoot.com

I didn't get into the Compile attempts, but I did notice that the Timing  
example with Pi/2 is slower than the other no matter WHEN you execute the  
two. For instance:

f[x_, y_] := 2 x + 3 y;
myRotate[pa_, e_, xoff_, yoff_, \[Theta]_,
    r_] := {xoff,
     yoff} + {r Cos[\[Pi] + \[Theta]],
      r e Sin[\[Pi] + \[Theta]]}.RotationMatrix[-pa];

{t2, plot} =
  Timing[Show[
     Table[Plot[
       f @@ {3 + 0.5` r Sin[\[Theta]], 4 - r Cos[\[Theta]]}, {\[Theta],
         0, 2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.031034, Null}

myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r]

{3 + 0.5 r Sin[\[Theta]], 4 - r Cos[\[Theta]]}

{t1, plot} =
  Timing[Show[
     Table[Plot[
       f @@ myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r], {\[Theta], 0,
        2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.072181, Null}

or

Quit

f[x_, y_] := 2 x + 3 y;
myRotate[pa_, e_, xoff_, yoff_, \[Theta]_,
    r_] := {xoff,
     yoff} + {r Cos[\[Pi] + \[Theta]],
      r e Sin[\[Pi] + \[Theta]]}.RotationMatrix[-pa];

{t1, plot} =
  Timing[Show[
     Table[Plot[
       f @@ myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r], {\[Theta], 0,
        2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.016648, Null}

myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r]

myRotate[\[Pi]/2, 0.5, 3, 4, \[Theta], r]

{t2, plot} =
  Timing[Show[
     Table[Plot[
       f @@ {3 + 0.5` r Sin[\[Theta]], 4 - r Cos[\[Theta]]}, {\[Theta],
         0, 2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.006654, Null}

Real arithmetic is faster than exact; it just is.

Also, Set is faster than SetDelayed, so:

f[x_, y_] = 2 x + 3 y;
myRotate[pa_, e_, xoff_, yoff_, \[Theta]_,
    r_] = {xoff,
     yoff} + {r Cos[\[Pi] + \[Theta]],
      r e Sin[\[Pi] + \[Theta]]}.RotationMatrix[-pa];

{t2, plot} =
  Timing[Show[
     Table[Plot[
       f @@ {3 + 0.5` r Sin[\[Theta]], 4 - r Cos[\[Theta]]}, {\[Theta],
         0, 2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.02081, Null}

{t1, plot} =
  Timing[Show[
     Table[Plot[
       f @@ myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r], {\[Theta], 0,
        2 \[Pi]}], {r, {1, 3, 5, 9}}]];]

{0.037412, Null}

Bobby

On Thu, 06 Aug 2009 05:32:28 -0500, Uayeb <uayebswinburne at gmail.com> wrote:

> All,
>
> This problem has bugged me for some time, particularly when I want to
> put plots inside manipulate functions. I like to define intermediate
> functions to abstract more complex computations from becoming pages of
> mathematica code, however, Mathematica seems to take a serious
> performance hit when I do this. Any ideas would be greatly
> appreciated. I've copied the notes and input/output from a notebook
> demonstrating this problem below.
>
> First we define a rediculously simple function of two variables.
>
> f[x_, y_] := 2 x + 3 y
>
> Then we define a coordinate transformation, which is more complex.
>
> myRotate[pa_, e_, xoff_, yoff_, \[Theta]_,
>   r_] := {xoff,
>    yoff} + {r Cos[\[Pi] + \[Theta]],
>     r e Sin[\[Pi] + \[Theta]]}.RotationMatrix[-pa]
>
> Asking Mathematica to make some plots using this rotation is slow.
>
> {t1, plot} = Timing[
>   Show[
>     Table[
>      Plot[f @@ myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r], {\[Theta],
> 0,
>        2 \[Pi]}],
>      {r, {1, 3, 5, 9}}]];]
>
>>>> {0.567545, Null}
>
> But, by executing the rotation with an undefined variable first, and
> replacing the function call inside plot with the "precomputed" result,
> the plot is 20 times faster.
>
> myRotate[\[Pi]/2, .5, 3, 4, \[Theta], r]
>
>>>> {3 + 0.5 r Sin[\[Theta]], 4 - r Cos[\[Theta]]}
>
> {t2, plot} = Timing[
>   Show[
>     Table[
>      Plot[f @@ {3 + 0.5` r Sin[\[Theta]], 4 - r Cos[\[Theta]]}, {\
> [Theta], 0,
>        2 \[Pi]}],
>      {r, {1, 3, 5, 9}}]];]
>
>>>> {0.025042, Null}
>
> t1/t2
>
>>>> 21.9529
>
> Naievely attempting to "complie" the function only makes the problem
> worse, because Mathematica seems to be trying to simplify the plotting
> function symbolicly first, although the above analysis doesn't support
> this.
>
> cmyRotate =
>   Compile[{{pa, _Real}, {e, _Real}, {xoff, _Real}, {yoff, _Real}, {\
> [Theta], \
> _Real}, {r, _Real}}, {xoff,
>      yoff} + {r Cos[\[Pi] + \[Theta]],
>       r e Sin[\[Pi] + \[Theta]]}.RotationMatrix[-pa]];
>
> Timing[
>  Show[
>    Table[
>     Plot[f @@ cmyRotate[\[Pi]/2, .5, 3, 4, \[Theta], r], {\[Theta],
> 0,
>       2 \[Pi]}],
>     {r, {1, 3, 5, 9}}]];]
>
> CompiledFunction::cfse: Compiled expression {{6.12323*10^-17,1.},
> {-1.,6.12323*10^-17}} should be a machine-size real number. >>
>
> CompiledFunction::cfex: Could not complete external evaluation at
> instruction 13; proceeding with uncompiled evaluation. >>
>
> CompiledFunction::cfse: Compiled expression {{6.12323*10^-17,1.},
> {-1.,6.12323*10^-17}} should be a machine-size real number. >>
>
> CompiledFunction::cfex: Could not complete external evaluation at
> instruction 13; proceeding with uncompiled evaluation. >>
>
> CompiledFunction::cfse: Compiled expression {{6.12323*10^-17,1.},
> {-1.,6.12323*10^-17}} should be a machine-size real number. >>
>
> General::stop: Further output of CompiledFunction::cfse will be
> suppressed during this calculation. >>
>
> CompiledFunction::cfex: Could not complete external evaluation at
> instruction 13; proceeding with uncompiled evaluation. >>
>
> General::stop: Further output of CompiledFunction::cfex will be
> suppressed during this calculation. >>
>
> {1.42678, Null}
>



-- 
DrMajorBob at bigfoot.com


  • Prev by Date: Re: Simple Slideshow templates?
  • Next by Date: Export tiff problems
  • Previous by thread: Plotting Speed: Plot and other functions not pre-compiling arguments?
  • Next by thread: video on Presentations by Williams and Park