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

조회 수: 402 (최근 30일)
Brooks
Brooks 2013년 6월 27일
댓글: Laukik Avinash Kharche 2022년 7월 1일
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

채택된 답변

Matthew Eicholtz
Matthew Eicholtz 2013년 6월 27일
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
Adoniram
Adoniram 2019년 1월 5일
COOL! thank you

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Jan
Jan 2013년 6월 28일
편집: Jan 2019년 5월 17일
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
Jan
Jan 2022년 6월 23일
@Laukik Avinash Kharche: I assume, this helps:
Avg = repelem(Avg, 10, 1);
Laukik Avinash Kharche
Laukik Avinash Kharche 2022년 7월 1일
Thanks a lot, it worked.
:)

댓글을 달려면 로그인하십시오.


Image Analyst
Image Analyst 2013년 6월 27일
편집: Image Analyst 2019년 1월 5일
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
Stelios Fanourakis
Stelios Fanourakis 2019년 5월 16일
편집: Stelios Fanourakis 2019년 5월 16일
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 2019년 5월 16일
Look at the code: These numbers are the size of the variable blockAveragedDownSignal.

댓글을 달려면 로그인하십시오.


Andrei Bobrov
Andrei Bobrov 2013년 6월 28일
편집: Andrei Bobrov 2017년 7월 28일
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
Stelios Fanourakis
Stelios Fanourakis 2019년 5월 13일
@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 2020년 7월 31일
Very nice job!

댓글을 달려면 로그인하십시오.


Aubai
Aubai 2017년 1월 20일

카테고리

Help CenterFile Exchange에서 Historical Contests에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by