Hi!
I have a 16:10000 matrix (positive and negative decimal values) and want to reshape it to a 16:10 matrix by averaging each row every 1000 columns. What's the best way to do this?
Thanks very much! SE

 Akzeptierte Antwort

the cyclist
the cyclist am 10 Apr. 2014

2 Stimmen

This solution using the filter() command calculates interim results way beyond your need, but it's fast:
% Put in some pretend data
r = rand(16,10000);
% Define number of columns to average
AVG_COLS = 1000;
% Dimension over which to average
DIM = 2; % Columns
% Use filter to calculate the moving average across EVERY combination of columns
r_moving_avg = filter(ones(1,AVG_COLS)/AVG_COLS,1,r,[],DIM);
% Grab only the column averages that were actually wanted
r_avg = r_moving_avg(:,AVG_COLS:AVG_COLS:end)

Weitere Antworten (3)

Jan
Jan am 10 Apr. 2014
Bearbeitet: Jan am 10 Apr. 2014

1 Stimme

r = rand(16, 10000);
s = reshape(r, 16, 1000, 10);
t = squeeze(mean(s, 2));
Some timings:
r = rand(16, 10000);
tic;
for k = 1:20
AVG_COLS = 1000;
DIM = 2; % Columns
r_moving_avg = filter(ones(1,AVG_COLS)/AVG_COLS,1,r,[],DIM);
r_avg = r_moving_avg(:,AVG_COLS:AVG_COLS:end);
end
toc
tic;
for k = 1:20
N = 1000 ;
szA = size(r) ;
B = arrayfun(@(k) mean(r(:,k:min(szA(2),k+N-1)),2), 1:N:szA(2), 'un', 0) ;
B = [B{:}] ;
end
toc
tic;
for k = 1:20
s = reshape(r, 16, 1000, 10);
t = squeeze(mean(s, 2)); end
toc
Elapsed time is 1.671149 seconds.
Elapsed time is 0.035495 seconds.
Elapsed time is 0.016600 seconds.
Sarah
Sarah am 10 Apr. 2014

0 Stimmen

Thanks so much - works like a charm!
Jos (10584)
Jos (10584) am 10 Apr. 2014

0 Stimmen

Another option:
A = rand(16,10000) ;
N = 1000 ;
szA = size(A) ;
B = arrayfun(@(k) mean(A(:,k:min(szA(2),k+N-1)),2), 1:N:szA(2), 'un', 0) ;
B = [B{:}] ;

Kategorien

Gefragt:

am 10 Apr. 2014

Bearbeitet:

Jan
am 10 Apr. 2014

Community Treasure Hunt

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

Start Hunting!

Translated by