我在Mathematica中遇到一个相当奇怪的行为,当在表中有超过250个加数的总和时。我实际上想要计算和推断一个数字数组上相当简单的移动平均值,但是想要这样做而不依赖于Mathematica的MovingAverage
,因为我想稍后改变它以使移动平均线超过不同的幂和函数样本数据。
最小的工作示例如下:
inputdata=RandomVariate[NormalDistribution[],100000];
average[n_, j_,data_]:=Sum[data[[k]],{k,n-j,n+j}]/(2j+1)
averagetable=With[{$j=100},Table[{n,average[n,$j,inputdata]},{n,1000,5000}]];
ListPlot[averagetable]
现在,只要$j
小于或小于124,就会立即执行(0.7秒)。但是,只要我将$j
增加到125或更多,相同的操作就需要三分钟。由于在这两种情况之间唯一改变的是加数的数量(第一种情况下为249,后者中为251),我猜Mathematica如何处理不同长度的总和存在一些差异。这是什么原因,我将如何解决这个问题?
编辑:感谢acl回答这个问题。 CompileLength
,在这种情况下SumCompileLength
选项确实可以解决问题,现在一切都按预期工作。
答案 0 :(得分:2)
您可以使用MovingAverage
更有效地实现此结果。
inputdata = RandomVariate[NormalDistribution[], 100000];
average[n_, j_, data_] := Sum[data[[k]], {k, n - j, n + j}]/(2 j + 1)
t1 = Timing[
averagetable =
With[{$j = 100},
Table[{n, average[n, $j, inputdata]}, {n, 1000, 5000}]];][[1]]
1.241809
t2 = Timing[
averagetable2 =
Thread[{Range[1000, 5000],
MovingAverage[inputdata[[900 ;; 5100]], 201]}];][[1]]
0.002761
t1/t2
450
(averagetable - averagetable2) // Chop[#, 10^-15] & // Union
{{0,0}}