Asked by Rica
on 6 Mar 2013

Hi!

a have a matrix:

% A=[2 5 6 8 7 ;2 2 3 5 6; 1 2 3 4 2]

how could i calculate the moving averege (order 2) of the matrix horizentally,
i mea the vectors `a1= [2 5 6 8 7]` and `a2=[2 2 3 5 6]` `a3=[1 2 3 4 2]` are indepandent .

the moving averege of each vector?

thank you

*No products are associated with this question.*

Answer by Andrei Bobrov
on 6 Mar 2013

Accepted answer

out = conv2(A,[.5 .5],'same'); out(:,1:end-1);

Andrei Bobrov
on 6 Mar 2013

out = [A(:,1),conv2(A,[.5 .5],'valid')];

Daniel Shub
on 6 Mar 2013

For an A of 1e3 x 1e5, it appears that Jan's direct method is faster, but if you are not worried about the edge, then your method is faster.

Answer by Jan Simon
on 6 Mar 2013

Edited by Jan Simon
on 7 Mar 2013

A = [2 5 6 8 7 ;2 2 3 5 6; 1 2 3 4 2]; B = (A(:, 1:4) + A(:, 2:5)) * 0.5;

This is one column shorter than the input, but how is the moving average defined at the edges?

[EDITED] A hard coded moving average for 5 neighboring elements along the rows:

[d1, d2] = size(X); Z1 = zeros(d1, 1); Z2 = zeros(d1, 2); M = X + [Z1, X(:, 1:d1 - 2) + X(:, 3:d1), Z1] + ... [Z2, X(:, 1:d1 - 4) + X(:, 5:d1), Z2]; divV(1, [1, 2, d1 - 1, d1]) = [1, 3, 3, 1]; divV(1, 3:d1 - 2) = 5; Y = bsxfun(@rdivide, M, div);

Here the first element is not changed and the 2nd is the average of the elements 1 to 3. I do not assume that this can beat CONV.

Rica
on 6 Mar 2013

the matrix to be avereged is too big!!

the first value stay unchanged.

thank you

Jan Simon
on 6 Mar 2013

Too big for what? Why is the first value unchanged and what exactly is "the first value"?

Rica
on 7 Mar 2013

my matrix is of the size 27*301528. i want the moving averege of each raw. the size of zhe window should be 5. that means or the first 5 value , i build the mean value with the mean function. from the sixth value should the moving averege start.

i am tryin now to use **filter2**, but i will be happy for other advices.

thank you

Answer by Image Analyst
on 6 Mar 2013

Moving how? In an m by n window? Or do you simply want the average of the *entire row*, in which case you can do this:

rowAverages = mean(A, 2);

Image Analyst
on 7 Mar 2013

Rica, if you want the mean of 5 horizontal numbers in a 27 by 302,528 matrix, you can do this:

means = conv2(yourArray, [1 1 1 1 1]/5, 'valid');

Related Content

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
## 0 Comments