2014-07-07 5 views
3

테이블에 250 개 이상의 피연산자가있는 경우 Mathematica에서 다소 이상하게 보입니다. 실제로 숫자 배열에 대해 비교적 직선적 인 이동 평균을 계산하고 표로 나타내려고하지만, Mathematica의 MovingAverage에 의존하지 않고 그렇게하고 싶습니다. 이후 샘플 데이터의 다른 힘과 함수에 대해 이동 평균을 수행하기 위해 변경하기를 원하기 때문입니다.Mathematica : 테이블에 250 개 이상의 피연산자가있는 경우 계산 속도가 느려짐

최소한의 작업 예는 다음과 같습니다

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 이상으로 증가 시키면 동일한 작업에 3 분이 소요됩니다. 이 두 경우 사이에서 변화하는 유일한 것은 summand의 수 (첫 번째 경우에는 249, 두 번째 경우에는 251)이므로 Mathematica가 다른 길이의 합계를 처리하는 방법에 약간의 차이가 있다고 생각합니다. 그 이유는 무엇이며,이 문제를 해결하려면 어떻게해야합니까?

편집 : 질문에 대답 해 주셔서 감사합니다. CompileLength,이 경우 SumCompileLength, 옵션이 실제로 트릭을 수행하므로 모든 것이 예상대로 작동합니다.

+2

'SystemOptions ["CompileOptions를 "] 'TableCompileLength'가 250 아마'SetSystemOptions [ "CompileOptions "인'것이 도시 TableCompileLength "-> Infinity}]'도움이 될 것입니다 (아마도 시도하지 않았습니다) – acl

+0

당신이 대답을 찾았 기 때문에 기쁘게 생각합니다.하지만 Partition과 Map으로 작업하면 더 잘할 것입니다. – agentp

답변

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

관련 문제