我需要在 n 个(在一种情况下为 14112)值的向量中对连续的 96 个值块求和。背景是这些值是 15 分钟的温度测量值,我想一次平均 96(1 到 96、96+1 到 2*96 ... n*96+1 到 (n+1)*96)产生一个每日平均值。这当然可以在循环步进 96 中完成,但我的问题是在 Matlab 中是否有更有效的方法来完成此操作。
问问题
950 次
2 回答
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, []));
于 2013-10-04T12:03:48.953 回答
2
这是很好地处理该问题的另一种方法,如果数据的长度不是窗口大小的一个很好的倍数,它也可以工作:
data = randn(1,14112);
w = 96;
N = numel(data);
M = NaN(w,ceil(N/w));
M(1:N) = data;
nanmean(M)
如果您不想在最后包含部分天数,请使用fix
而不是ceil
.
于 2013-10-04T13:40:37.513 回答