How do I take the average of every n values in a vector?

243 visualizaciones (últimos 30 días)
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

Respuesta aceptada

Matthew Eicholtz
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
Adoniram
Adoniram el 5 de En. de 2019
COOL! thank you

Iniciar sesión para comentar.

Más respuestas (4)

Jan
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
Jan el 23 de Jun. de 2022
@Laukik Avinash Kharche: I assume, this helps:
Avg = repelem(Avg, 10, 1);
Laukik Avinash Kharche
Laukik Avinash Kharche el 1 de Jul. de 2022
Thanks a lot, it worked.
:)

Iniciar sesión para comentar.


Image Analyst
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
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
Jan el 16 de Mayo de 2019
Look at the code: These numbers are the size of the variable blockAveragedDownSignal.

Iniciar sesión para comentar.


Andrei Bobrov
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
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.
Imran Yasin
Imran Yasin el 31 de Jul. de 2020
Very nice job!

Iniciar sesión para comentar.


Aubai
Aubai el 20 de En. de 2017

Community Treasure Hunt

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

Start Hunting!

Translated by