# How to improve efficiency of Table expression

Posted 8 years ago
6517 Views
|
5 Replies
|
0 Total Likes
|
 The following code is correct but is highly inefficient: data2 = RandomVariate[NormalDistribution[0, 1], 10^6]; MyList2 = Table[Mean[Take[data2, i]], {i, Length[data2]}]; Is there a concise way of doing this more efficiently?
5 Replies
Sort By:
Posted 8 years ago
 Thank you all for the helpful responses.
Posted 8 years ago
 Look at this In:= FoldList[Plus, a, {b, c, d, f}]/Range Out= {a, (a + b)/2, 1/3 (a + b + c), 1/4 (a + b + c + d), 1/5 (a + b + c + d + f)} with other words FoldList[Plus, First[data2], Rest[data2]]/Range[Length[data2]] should do it.
Posted 8 years ago
 Somewhat faster, by keeping the arrays packed: myList = Accumulate[data2]/N[Range[Length[data2]]]; myList == MyList2 takes about 0.01 seconds on my machine.
Posted 8 years ago
 If you're wanting to calculate the sequential means of observations 1, 1+2, 1+2+3, etc., then MyEfficientList = Accumulate[data2]/Table[i, {i, Length[data2]}] is much faster.If you're then going to do something with those sequential means, there might be more efficient ways to get to that final product.
Posted 8 years ago
 Seems to me the mean of k+1 terms can be calculated from the mean of k terms and the k+1 term, if you're willing to put up with round off errors. You could do that sequentially starting with the first term and that should be faster.