MathGroup Archive 2008

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

Search the Archive

Re: Calculate the first time, not each time (?)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg94576] Re: Calculate the first time, not each time (?)
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Tue, 16 Dec 2008 06:04:28 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <gi7ljg$cui$1@smc.vnet.net>

Michael Young wrote:
> Hello,
>
> I'm doing some engineering which will involve a large number of points  
> -- and I anticipate time problems if all steps are repeated for each  
> one.   Here's an outline of the way I'd like to approach it.
> 
> shapeprimativeXvalues := N[Table[functionpX[v], {v, vlimit}]]
> shapeprimativeYvalues := N[Table[functionpY[v], {v, vlimit}]]
> 
> Arriving at these will involve some calculation, and once the results  
> are in, it is unnecessary that the this be repeated when the values  
> are used.
> 
> adaptshapetoitslocation[v_] := (various operations on or including)  
> shapeprimativeXvalues[[v]] (and or) shapeprimativeYvalues[[v]]
>
> Is there a way I can instruct Mathematica to evaluate a table, (value  
> or function), once, when it is first called; then not to evaluate it  
> again, but to pass numerical results on request?

Hi Michael,

The following example outlines a possible approach to what I think you 
want to achieve, though I do not like this implementation since it uses 
(too) many *global* variables.

t := If[Length[tvals] == 0, tvals = N[Table[f[v], {v, vlimit}]], tvals]

So, the function t is evaluated every time it is called (thanks to the 
operator SetDelayed ':=') but it checks if the global array tvals 
already holds some values (i.e. if the array length is not zero). If the 
array is empty, values are computed, stored in tvals, and returned to 
the caller. If the array holds previous values, these values are 
directly returned to the caller. Below is a fully working example.

Clear[f, g, t]
f[x_] := Sin[x] RandomInteger[]
t := If[Length[tvals] == 0, Print["To Be Computed..."];
   tvals = N[Table[f[v], {v, vlimit}]], Print["Already Computed"];
   tvals]
vlimit = 2 Pi;
tvals =.;
g[v_] := Module[{x}, t; Print[t]; x = t[[v]]; Print[x]]

g[2]

To Be Computed...

Already Computed

{0.,0.,0.14112,0.,0.,0.}

Already Computed

0.

g[3]

Already Computed

Already Computed

{0.,0.,0.14112,0.,0.,0.}

Already Computed

0.14112

Hope this helps,
-- Jean-Marc



  • Prev by Date: Re: Recognising parameters in function
  • Next by Date: Re: A version of With that binds variables sequentially
  • Previous by thread: Re: Calculate the first time, not each time (?)
  • Next by thread: Re: Calculate the first time, not each time (?)