我需要在n(在一种情况下为14112)值的向量中对连续的96个值块求和。背景是这些值是15分钟的温度测量,我想一次平均96(1到96,96 + 1到2 * 96 ... n * 96 + 1到(n + 1)* 96)产生每日平均值。这当然可以在循环步进96中完成,但我的问题是在Matlab中是否有更有效的方法来实现这一点。
答案 0 :(得分:6)
使用reshape
和mean
:
data = randn(1,14112); % example data. Row vector
m = 96; % block size. It is assumed that m divides length(data)
result = mean(reshape(data,m,[]));
正如@Dan所指出的,如果元素的数量不是块大小的倍数,则需要一些填充。由于他的原因,下面的代码在最后一个块中进行必要的填充,同时保持该块的平均值。还要感谢@DennisJaheruddin提出的不要修改原始变量的建议:
data = randn(1,14100); % example data. Row vector
m = 96; % block size
n = length(data);
result = mean(reshape([data repmat(mean(data(n-mod(n,m)+1:n)), 1, m - mod(n, m))], m, []));
答案 1 :(得分:2)
这是另一种很好地处理问题的方法,如果数据的长度不是窗口大小的很好的倍数,它也可以工作:
data = randn(1,14112);
w = 96;
N = numel(data);
M = NaN(w,ceil(N/w));
M(1:N) = data;
nanmean(M)
如果您不希望在结尾处包含部分日期,请使用fix
代替ceil
。