Finding average of every nth row?

78 visualizzazioni (ultimi 30 giorni)
farkab95
farkab95 il 13 Nov 2017
Commentato: Luis Camacho il 16 Apr 2021
I have a column vector that is 9985x1. I want to create a new vector that lists the average of every 6 rows in the column. How can I do this? Is there a way to do it with a loop?
Thank you!
  2 Commenti
Jan
Jan il 13 Nov 2017
"of every 6 rows" or "of every 6th row"?
farkab95
farkab95 il 13 Nov 2017
The average of rows 1 to 6 and then rows 7 to 12 and then 13 to 18 etc. Thanks!

Accedi per commentare.

Risposta accettata

Jan
Jan il 13 Nov 2017
Modificato: Jan il 4 Apr 2019
This is the mean over 6 subsequent rows:
x = rand(9985, 1);
S = numel(x);
xx = reshape(x(1:S - mod(S, 6)), 6, []);
y = sum(xx, 1).' / 6;
The trailing rows are ignored.
[EDITED] General method for matrices:
x = rand(9985, 14);
p = 6;
n = size(x, 1); % Length of first dimension
nc = n - mod(n, p); % Multiple of p
np = nc / p; % Length of result
xx = reshape(x(1:nC, :), p, np, []); % [p x np x size(x,2)]
y = sum(xx, 1) / p; % Mean over 1st dim
y = reshape(y, np, []); % Remove leading dim of length 1
  6 Commenti
Jan
Jan il 4 Apr 2019
Modificato: Jan il 4 Apr 2019
@vicsim: See [EDITED]
Ade Narayana
Ade Narayana il 11 Apr 2019
Super!! Thank you Jan!!

Accedi per commentare.

Più risposte (3)

Andrei Bobrov
Andrei Bobrov il 13 Nov 2017
Modificato: Andrei Bobrov il 13 Nov 2017
Let A - your array (9985 x 1).
out = splitapply(@mean,A,ceil((1:numel(A))'/6));
or
out = accumarray(ceil((1:numel(A))'/6),A(:),[],@mean);

Birdman
Birdman il 13 Nov 2017
mean(A(1:6:9985),:)
  1 Commento
Jan
Jan il 13 Nov 2017
This creates a vector of every 6th element of A at first. Then mean(AA, :) is most likely a typo and mean(A(1:6:end, :)) is meant.

Accedi per commentare.


Joe S
Joe S il 26 Dic 2018
These answers work when dim=1 but appears to fail for ndims =2 (multiple columns). To average nRows together (variable "gps") for ndims=2, see below. You have the option of including the average of the "modulus rows" with: includeMods=1.
%create simple matrix, easier to check vs. random numbers
nRows = 11;
nCols = 3;
includeMods=1;
x = reshape(1:(nRows*nCols),[nRows,nCols]);
%provide row number to average over
grps = 3;
%determine remainder rows from Modulo operation
exRows = mod(nRows,grps);
% work with the top portion that group "cleanly"
topM = x(1:end-exRows,:);
%gather dims for reshaping
nRowsTop = size(topM,1);
numTop = numel(topM);
%Reshape so nrows = grps (row number to average over)
flatTop = reshape(topM,[grps numTop./grps]);
%take averages
meanTop = mean(flatTop,1);
% reshape back to original number of columns
final = reshape(meanTop,[nRowsTop./grps nCols]);
%optional, average the modulus rows, add back into final answer
if includeMods
if ~(exRows==0)
exMat= x(end-exRows+1:end,:);
meanEx = mean(exMat,1);
final = vertcat(final,meanEx);
end
end

Categorie

Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by