How to calculate average in a large matrix?
3 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
afrya
el 2 de Dic. de 2013
Comentada: Jos (10584)
el 3 de Dic. de 2013
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
0 comentarios
Respuesta aceptada
Andrei Bobrov
el 3 de Dic. de 2013
Editada: Andrei Bobrov
el 3 de Dic. de 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 comentarios
Más respuestas (2)
Azzi Abdelmalek
el 2 de Dic. de 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 comentarios
Azzi Abdelmalek
el 2 de Dic. de 2013
Editada: Azzi Abdelmalek
el 2 de Dic. de 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
Jos (10584)
el 2 de Dic. de 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 comentarios
Jos (10584)
el 3 de Dic. de 2013
see
doc eps
In many cases, like here, differences smaller than the value of eps are not important
Ver también
Categorías
Más información sobre Matrices and Arrays en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!