Re: Map and functional constructs to replace iterative statements
- To: mathgroup at smc.vnet.net
- Subject: [mg96863] Re: [mg96783] Map and functional constructs to replace iterative statements
- From: Sseziwa Mukasa <mukasa at jeol.com>
- Date: Thu, 26 Feb 2009 07:57:02 -0500 (EST)
- References: <200902250900.EAA15513@smc.vnet.net>
On Feb 25, 2009, at 4:00 AM, Andreas wrote:
> I have begun to replace Table, Do, While, or For, but in my
> thinking with Map, Inner, Outer and other functional programming
> constructs as I learn more about Mathematica.
>
> But, I'm stuck. I need to figure out how to use Map (or some
> related approach) when a function needs both a current value and a
> previous value in a time series, such as a percentage change
> function (or perhaps more generally stated, when I need to refer to
> previous values in a series or even previous calculations). But
> first a simple case:
>
> percentChange[currentValue_, previousValue_] := 100 *
> ( currentValue - previousValue) / previousValue
>
> I know how to apply this iteratively, but how can I do it with Map
> or some other functional construct?
One option is to use create the pairs of arguments, then apply the
function
percentChange[#,#2]&@@@Transpose[{Rest[timeSeries],Most[timeSeries]}]
Another option is to do it recursively:
computeChanges[{results_,{previous_,current_}}]:=Append
[results,percentChange[previous,current]]
computeChanges[{results_,{args__}}]:=computeChanges[{Append
[results,percentChange[{args}[[2]],{args}[[1]]]],Rest[{args}]}]
computeChanges[timeSeries_]:=computeChanges[{{},timeSeries}]/;VectorQ
[timeSeries]&&Length[timeSeries]>=2
I realize the recursive solution does not use functional programming
constructs but I've found that not having to worry about explicit
indices can result in less bugs.
Regards,
Sseziwa Mukasa
- References:
- Map and functional constructs to replace iterative statements
- From: Andreas <aagas@ix.netcom.com>
- Map and functional constructs to replace iterative statements