How do I take the average of every n values in a vector?
243 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Brooks
el 27 de Jun. de 2013
Comentada: Laukik Avinash Kharche
el 1 de Jul. de 2022
I have some data on Pulse Rate and the sample was taken at 1000 Hz (One sample every millisecond), way too big for what I want to see. My vector is 399277x1 and I want to be able to average every 1000 values and get that number in a new vector of somewhere around 400x1. Is there any way to do this?
Thanks
0 comentarios
Respuesta aceptada
Matthew Eicholtz
el 27 de Jun. de 2013
Try this...
n = 1000; % average every n values
a = reshape(cumsum(ones(n,10),2),[],1); % arbitrary data
b = arrayfun(@(i) mean(a(i:i+n-1)),1:n:length(a)-n+1)'; % the averaged vector
9 comentarios
Más respuestas (4)
Jan
el 28 de Jun. de 2013
Editada: Jan
el 17 de Mayo de 2019
x = rand(399277, 1); % Some example data
n = 1000; % Number of elements to create the mean over
s1 = size(x, 1); % Find the next smaller multiple of n
m = s1 - mod(s1, n);
y = reshape(x(1:m), n, []); % Reshape x to a [n, m/n] matrix
Avg = transpose(sum(y, 1) / n); % Calculate the mean over the 1st dim
10 comentarios
Jan
el 23 de Jun. de 2022
@Laukik Avinash Kharche: I assume, this helps:
Avg = repelem(Avg, 10, 1);
Image Analyst
el 27 de Jun. de 2013
Editada: Image Analyst
el 5 de En. de 2019
Here is how I'd do it (an alternate way), using blockproc to average in 100 element long blocks in "jumps":
% Create sample data
PulseRateF = rand(399277, 1);
% Define the block parameter. Average in a 100 row by 1 column wide window.
blockSize = [1000, 1];
% Block process the image to replace every element in the
% 100 element wide block by the mean of the pixels in the block.
% First, define the averaging function for use by blockproc().
meanFilterFunction = @(theBlockStructure) mean2(theBlockStructure.data(:));
% Now do the actual averaging (block average down to smaller size array).
blockAveragedDownSignal = blockproc(PulseRateF, blockSize, meanFilterFunction);
% Let's check the output size.
[rows, columns] = size(blockAveragedDownSignal)
5 comentarios
Stelios Fanourakis
el 16 de Mayo de 2019
Editada: Stelios Fanourakis
el 16 de Mayo de 2019
I am not sure whether I understood it well. I use this
% Create sample data
PulseRateF = Pd;
% Define the block parameter. Average in a 100 row by 1 column wide window.
blockSize = [300, 100];
% Block process the image to replace every element in the
% 100 element wide block by the mean of the pixels in the block.
% First, define the averaging function for use by blockproc().
meanFilterFunction = @(theBlockStructure) mean2(theBlockStructure.data(:));
% Now do the actual averaging (block average down to smaller size array).
blockAveragedDownSignal = blockproc(PulseRateF, blockSize, meanFilterFunction);
% Let's check the output size.
[rows, columns] = size(blockAveragedDownSignal)
And I get
rows = 5 columns = 1
What those numbers mean?
Jan
el 16 de Mayo de 2019
Look at the code: These numbers are the size of the variable blockAveragedDownSignal.
Andrei Bobrov
el 28 de Jun. de 2013
Editada: Andrei Bobrov
el 28 de Jul. de 2017
x = randi(1000,399277,1);
n = 1000;
m = numel(x);
out = nanmean(reshape( [x(:);nan(mod(-m,n),1)],n,[]));
or
out = accumarray(ceil((1:numel(x))/1000)',x(:),[],@mean);
3 comentarios
Stelios Fanourakis
el 13 de Mayo de 2019
@Andrei Bobrov
What this actually does? Does it average in a step of n intervals along the x axis? This is what I am looking for. Hope this does what I want.
I want to divide the x axis into intervals and average between them.
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!