Mathematica:表中超过250个求和的Sum导致计算速度慢

时间:2014-07-07 13:46:22

标签: sum wolfram-mathematica

我在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选项确实可以解决问题,现在一切都按预期工作。

1 个答案:

答案 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}}