2012-12-09 4 views
1

GNU Octave에서 for 루프를 사용하지 않고 벡터의 n 일 지수 이동 평균을 계산하려고합니다.벡터화 된 지수 이동 평균을 옥타브 단위로 수행

for 루프를 사용하여이 작업을 수행 할 수 있지만 비효율적입니다. 필터 함수를 사용하고 싶습니다만, 올바르게 작동하려면 어떻게 해야할지 모르겠습니다.

답변

1

스레드

http://octave.1599824.n4.nabble.com/vectorized-moving-average-td2132090.html

에서 함께 비트를 조립할 후 I 옥타브의 필터 기능을 이용하여이 기능을 내장.

function meanV = movingEMean(V, window) 
    simpleAvg = mean(V(1:window)); 
    alpha = 1/window; 
    X = V(window:end); 
    X(1) = simpleAvg; 
    meanV = filter(alpha, [1 alpha-1], X, simpleAvg*(1-alpha)); 
end 

기본으로 간단한 이동 평균으로 시작됩니다. V은 지수 이동 평균을 계산하는 숫자의 열 벡터입니다. window은 일 수의 정수입니다. 12를 사용했습니다.

다음은이 함수에 대한 수학적 설명입니다.

http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average

alpha로 (nwindow 또는 일의 번호입니다)하지만, alpha의 값이 내 요구에 맞는 때문에 나는 1/n를 사용하는 페이지 2/(n+1)를 사용하는. 필요에 따라 alpha을 조정하십시오.

또는 입력/출력 벡터의 치수가 일치해야하는 경우가 있습니다. movingEMean 함수의 마지막 줄에 meanV = [NaN(window-1,1); meanV];을 추가하여 유효하지 않은 값을 NaN으로 채 웁니다. 대략적인 추측을 원할 경우 simpleAvg으로 채울 수도 있습니다.

관련 문제