如果您经常需要执行此操作,可能值得为它编写自己的函数。我建议使用@EitanT 的基本思想:填充数据、重塑、取每一列的平均值。但是,我建议不要在末尾包含零填充数字,而是分别取“散乱”数据点的平均值:
function m = meanOfN(x, N)
% function m = meanOfN(x, N)
% create groups of N elements of vector x
% and return their mean
% if numel(x) is not a multiple of N, the last value returned
% will be for fewer than N elements
Nf = N * floor( numel( x ) / N ); % largest multiple of N <= length of x
xr = reshape( x( 1:Nf ), N, []);
m = mean(xr);
if Nf < N
m = [m mean( x( Nf + 1:end ) )];
end
此函数将准确返回您所要求的内容:在 N=5 的 15 元素向量的情况下,它返回 3 个值。当输入向量的大小不是 N 的倍数时,最后返回的值将是“剩余的平均值”。
当您需要取一组数字的平均值时,通常会感兴趣的是“运行平均值”。因此,您可能想要,而不是获得[mean(x(1:5)) mean(x(6:10)) mean(11:15))],
m(1) = mean(x(1:N));
m(2) = mean(x(2:N+1));
m(3) = mean(x(3:N+2));
...etc
这可以通过将数据与向量进行简单卷积来实现;为了完整起见,这里有一种可能的编码方式:
function m = meansOfN(x, n)
% function m = meansOfN(x, n)
% taking the running mean of the values in x
% over n samples. Returns a row vector of size (sizeof(x) - n + 1)
% if numel(x) < n, this returns an empty matrix
mv = ones(N,1) / N; % vector of ones, normalized
m = convn(x(:), mv, 'valid'); % perform 1D convolution
在您的路径中使用这两个函数(将它们分别保存在一个名为meanOfN.m 和meansOfN.m 的文件中),您可以做任何您想做的事情。在任何程序中您都可以编写
myMeans = meanOfN(1:30, 5);
myMeans2 = meansOfN(1:30, 6);
等等。 Matlab 会找到函数,执行计算,返回结果。为这样的特定操作编写自定义函数非常有帮助 - 它不仅可以保持代码整洁,而且您只需测试一次函数...