Discover MakerZone

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

How to use accumarray?

Asked by Ede gerlderlands

Ede gerlderlands

on 30 Jun 2013
Accepted Answer by the cyclist

the cyclist

I have a matrix of y=[9, 5346]

I want to find the the mean of every six values of each row. I tried this function but can't really figure out how to do it

 for ii=1:9
 oo(ii)=accumarray(1:6:5346,y(ii,:),,[],@mean);
   end

it's saying there is error in this code . I don't really know how this accumarray works.

Any help is appreciated

0 Comments

Ede gerlderlands

Ede gerlderlands

Products

No products are associated with this question.

2 Answers

Answer by the cyclist

the cyclist

on 30 Jun 2013
Edited by the cyclist

the cyclist

on 30 Jun 2013
Accepted answer

accumarray() can be a bit tricky to learn. I think this solves your problem. I commented it to help you see what is happening.

A = rand(9,5346); % Make up some fake data that is the same size as yours
At = A'; % Take the transpose, because accumarray works down columns.
numberPerGroup = 6;
numberGroups = 5346/6; % 931, but wanted you to see where this comes from
% The subs array indicates which rows (of the transposed array) are going to get grouped. You have 931 groups total, each gather 6 rows.
subs = repmat(1:numberGroups,[numberPerGroup,1]);
subs = subs(:);
% Preallocate the output array
output = zeros(numberGroups,9);
% Accumulate each column in turn
for nr = 1:9
    output(:,nr) = accumarray(subs,At(:,nr),[],@mean);
end
% Transpose the output back
output = output';

1 Comment

Ede gerlderlands

Ede gerlderlands

on 30 Jun 2013

Thank you ..

the cyclist

the cyclist

Answer by Matt J

Matt J

on 30 Jun 2013

Although you can do this with accumarray, it will probably be faster to do

 oo=downsampn(y,[1,6]);

using the function below.

function M=downsampn(M,bindims)
%DOWNSAMPN - simple tool for downsampling n-dimensional nonsparse arrays
%
%  M=downsampn(M,bindims)
%
%in:
%
% M: an array
% bindims: a vector of integer binning dimensions
%
%out:
%
% M: the downsized array
nn=length(bindims);
[sz{1:nn}]=size(M); %M is the original array
sz=[sz{:}];
newdims=sz./bindims;
args=num2cell([bindims;newdims]);
M=reshape(M,args{:});
for ii=1:nn
   M=mean(M,2*ii-1);
end
M=reshape(M,newdims);

1 Comment

Ede gerlderlands

Ede gerlderlands

on 30 Jun 2013

Yes, thank you.

Matt J

Matt J

Contact us