2013-06-12 2 views
3

MATLAB을 사용하여 행렬의 특정 열에 대한 3 일 이동 평균을 찾고 해당 행렬에 이동 평균을 추가하려면 어떻게합니까? 행렬의 아래에서 위로 3 일 이동 평균을 계산하려고합니다. 다음 행렬 A와 마스크를 감안할 때MATLAB을 사용하여 이동 평균을 찾는 방법은 무엇입니까?

: 내 코드를 제공 한 나는 전환 명령을 구현하는 시도

a = [1,2,3;4,5,6;7,8,9;10,11,12;13,14,15;16,17,18]; 
mask = ones(3,1); 

을하지만, 나는 오류가 발생하고있다. 여기에 내가 행렬 A의 2 열을 사용하려고 시도 된 전환 명령입니다 :

a(:,4) = conv(a(:,2),mask,'valid'); 

나는 다음과 같은 행렬에 주어진 원하는 출력 : 당신이 어떤 제안이 있다면

desiredOutput = [1,2,3,5;4,5,6,8;7,8,9,11;10,11,12,14;13,14,15,0;16,17,18,0;] 

, 나는 그것을 매우 감사 할 것이다. 고맙습니다!

+0

는 이동 평균을위한'[1 1 1]'회선 커널은 다음과 같습니다

대신 당신은 몇 줄을 사용하도록 강요? –

+0

네, 맞습니다. 나는 그것이 conv를 호출하면서 3 일 이동 평균을 나타내는 방법이라고 생각했다. – Aaron

+1

원하는 출력이 이동 평균처럼 보이지 않습니다. 어떻게이 값들을 얻고 있습니까? – Phonon

답변

4

일반적으로 오류를 표시하면 도움이됩니다. 이 경우 두 가지 잘못하고있다 :

먼저 당신의 회선 세 (또는 이동 평균의 길이)로 나눈해야

c = conv(a(:,2),mask,'valid')/3 

c = 

    5 
    8 
    11 
    14 

둘째, c의 크기를 알 수 있습니다. ac을 넣을 수는 없습니다. 이동 평균을 얻기의 일반적인 방법은 same을 사용하는 것입니다 :

a(:,4) = conv(a(:,2),mask,'same')/3 

a = 

    1.0000 2.0000 3.0000 2.3333 
    4.0000 5.0000 6.0000 5.0000 
    7.0000 8.0000 9.0000 8.0000 
    10.0000 11.0000 12.0000 11.0000 
    13.0000 14.0000 15.0000 14.0000 
    16.0000 17.0000 18.0000 10.3333 

을하지만 당신이 원하는 것처럼 보이지 않는다.

c = conv(a(:,2),mask,'valid')/3; 
a(1:length(c),4) = c 

a = 

    1  2  3  5 
    4  5  6  8 
    7  8  9 11 
    10 11 12 14 
    13 14 15  0 
    16 17 18  0 
+0

완벽한! 고맙습니다. 이것은 정확하게 내가 루프를 사용할 필요가 없도록 찾고 있던 것입니다. – Aaron

관련 문제