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

243 Ansichten (letzte 30 Tage)
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

Akzeptierte Antwort

Matthew Eicholtz
Matthew Eicholtz am 27 Jun. 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 Kommentare
Adoniram
Adoniram am 5 Jan. 2019
COOL! thank you

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

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

Melden Sie sich an, um zu kommentieren.


Image Analyst
Image Analyst am 27 Jun. 2013
Bearbeitet: Image Analyst am 5 Jan. 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 Kommentare
Stelios Fanourakis
Stelios Fanourakis am 16 Mai 2019
Bearbeitet: Stelios Fanourakis am 16 Mai 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 am 16 Mai 2019
Look at the code: These numbers are the size of the variable blockAveragedDownSignal.

Melden Sie sich an, um zu kommentieren.


Andrei Bobrov
Andrei Bobrov am 28 Jun. 2013
Bearbeitet: Andrei Bobrov am 28 Jul. 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 Kommentare
Stelios Fanourakis
Stelios Fanourakis am 13 Mai 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.

Melden Sie sich an, um zu kommentieren.


Aubai
Aubai am 20 Jan. 2017

Community Treasure Hunt

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

Start Hunting!

Translated by