gpt4 book ai didi

sum - Mathematica : Sum with more than 250 summands in table leads to slow computation

转载 作者:行者123 更新时间:2023-12-04 16:47:19 25 4
gpt4 key购买 nike

当表中有超过 250 个被加数的总和时,我在 Mathematica 中遇到了一个相当奇怪的行为。我实际上想计算和表格化一个相当简单的数字数组的移动平均线,但希望在不依赖 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 ,选项确实可以解决问题,现在一切都按预期工作。

最佳答案

您可以使用 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}}

关于sum - Mathematica : Sum with more than 250 summands in table leads to slow computation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24612106/

25 4 0