
My first approach would be to generate the list of sliding windows: [[4,3,2],[3,2,6],[2,6,7]] after importing Data.List:
map (take 3) . tails $ [4,3,2,6,7] [[4,3,2],[3,2,6],[2,6,7],[6,7],[7],[]]
Not quite what we want, but close:
filter ((== 3) . length) . map (take 3) . tails $ [4,3,2,6,7] [[4,3,2],[3,2,6],[2,6,7]]
So (filter ((== 3) . length) . map (take 3) . tails) seems to be the
desired function. Now just map average.
However, we don't really need the sliding windows themselves, just the
sliding sum. There might be a slightly more efficient way to do that,
but I'll leave it as an exercise for you or somebody else.
--Max
On Thu, Aug 27, 2009 at 10:19 AM,
Hi,
Imagine you have a list with n-values. You are asked to iterate over the list and calculate the average value of each 3 neighbouring values.
For example, starting from
[4,3,2,6,7]
you need to find the averages of
4,3,2 and 3,2,6 and 2,6,7
resulting in
[3,4,5]
What is the most elegant way to do that? The naive ansatz to use "(!!") excessively sounds pretty inefficient.
Bye, Lenny _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe