How to calculate average in a large matrix?

1 view (last 30 days)
Dear all,
I'm working with a large amount of data in a project.For each row of my matrix , I calculate the average. Here is an example that help you to understand my problem
y1 y2 y3 y4 y5
x1 2 4 4 6 7 Av1=4,6
x2 1 2 3 4 5 Av2=3
x3 1 2 3 4 5 Av3=3
x4 1 2 4 5 6 Av4=3,6
x5 2 5 6 8 9 Av5=6
x6 4 7 8 4 9 Av6=6,4
x7 2 3 4 8 7 Av7=4,8
x8 1 2 4 6 4 Av8=3,4
I want to make my programm user friendly, that means the user enter the number of average that he wants.For instance, if the user enter the number 2 , the programm calculates the average of each 2 rows
y1 y2 y3 y4 y5
x1 2 4 4 6 7 NewAv1=Av1+Av2=3,8
x2 1 2 3 4 5
x3 1 2 3 4 5 NewAv2=Av3+Av4=3,3
x4 1 2 4 5 6
x5 2 5 6 8 9 NewAv3=Av5+Av6=6,2
x6 4 7 8 4 9
x7 2 3 4 8 7 NewAv4=Av7+Av8=4,1
x8 1 2 4 6 4
Thank you in advance

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 3 Dec 2013
Edited: Andrei Bobrov on 3 Dec 2013
xy = [2 4 4 6 7
1 2 3 4 5
1 2 3 4 5
1 2 4 5 6
2 5 6 8 9
4 7 8 4 9
2 3 4 8 7
1 2 4 6 4];
k = 2;
i0 = zeros(size(xy,1),1);
i0(1:k:end) = 1;
out = accumarray(repmat(cumsum(i0),size(xy,2),1),xy(:),[],@mean);
ADD
xy2 = xy(1:floor(size(xy,1)/k)*k,:);
s = size(xy2);
i0 = zeros(s(1),1);
i0(1:k:end) = 1;
out = accumarray(repmat(cumsum(i0),s(2),1),xy2(:),[],@mean);
  3 Comments
Jos (10584)
Jos (10584) on 3 Dec 2013
My suggestion seems more efficient (no cumsum, for instance) ...

Sign in to comment.

More Answers (2)

Azzi Abdelmalek
Azzi Abdelmalek on 2 Dec 2013
%Example--------------
A=rand(10)
p=3
%-----------------------
[n,m]=size(A);
q=ceil(n/p)*p
B=nan(q,m)
B(1:n,:)=A
ii2=p:p:q
ii1=[1 ii2(1:end-1)+1]
out=arrayfun(@(x) nanmean(nanmean(B(ii1(x):ii2(x),:))),1:numel(ii2))'
  4 Comments
afrya
afrya on 2 Dec 2013
the size of the matrix is: 3500*579
Azzi Abdelmalek
Azzi Abdelmalek on 2 Dec 2013
Edited: Azzi Abdelmalek on 2 Dec 2013
%Example--------------
A=rand(3500,379);
p=3;
%-----------------------
tic
[n,m]=size(A);
q=ceil(n/p)*p;
B=nan(q,m);
B(1:n,:)=A;
B=reshape(B',p*m,[]);
out=nanmean(B);
toc
result
Elapsed time is 0.043406 sec

Sign in to comment.


Jos (10584)
Jos (10584) on 2 Dec 2013
Here is a trick, using clever indexing with accumarray:
% data
A = rand(10,5) ;
K = 3 ; % average of so many rows
% engine
ix = repmat(floor((0:(size(A,1)-1))/K),size(A,2),1).' + 1 % indices
AV = accumarray(ix(:), A(:), [ix(end) 1], @mean) % averages
% check
abs(AV(1) - mean(reshape(A(1:K,:),1,[]))) < eps
  3 Comments
Jos (10584)
Jos (10584) on 3 Dec 2013
see
doc eps
In many cases, like here, differences smaller than the value of eps are not important

Sign in to comment.

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!