2016-09-22 53 views
1

我有一个数组(大小2958的×1)。我想平均每五个单独的元素开始并将结果存储到一个新的数组中。例如:(非重叠移动)每n个元件的平均在载体

arr = (1:10).'; % for this array 
avg = [3; 8]; % this should be the result 

我该怎么做?计算阵列中的每个n元的平均

+0

你的意思的运行平均值 - 即,第一结果是数据的平均值(1:5),和第二平均的数据(2:6),或者说是第二结果数据的平均(6: 10)? – Dave

+0

我应该在我的最后一条评论中说过,如果是第一个案例,请查看http://uk.mathworks.com/help/matlab/ref/filter.html,它将此作为第一个工作示例。如果是第二个,那么我会提出类似'mean(reshape(data,[],5),2);',但数据长度必须是5的倍数才能工作。 – Dave

+0

@戴夫是的......第一个结果是(1:5)的平均值,第二个结果是(6:10)。并且是的数据应该是5的长度倍数,但它的长度不是5的倍数,那么其余的点(对于exp 3点在这种情况下仍然是2985以外)可以按照原样添加到结果数组中。 – user3162506

回答

2

一种方法是使用arrayfun

n = 5; 
arr = rand(2958,1); % your array 
avg = arrayfun(@(ii) mean(arr(ii:ii + n - 1)), 1:n:length(arr) - n + 1)'; 

更新:

这样更快:

avg = mean(reshape(arr(1:n * floor(numel(arr)/n)), [], n), 2); 

区别在于BIG:

------------------- With ARRAYFUN 
Elapsed time is 4.474244 seconds. 
------------------- With RESHAPE 
Elapsed time is 0.013584 seconds. 

arrayfun在这里如此缓慢的原因是我没有正确使用它。 arr(ii:ii + n - 1)在内存中创建一个数组,它会发生很多次。另一方面,reshape方法可以无缝工作。

+0

你能告诉我这个命令的含义,它是如何工作的 – user3162506

+0

['numel'] (http://de.mathworks.com/help/matlab/ref/numel.html),['floor'](http://www.mathworks.com/help/matlab/ref/floor.html),[ 'reshape'](https://de.mathworks.com/help/matlab/ref/reshape.html),['mean'](https://de.mathworks.com/help/matlab/ref/mean。 HTML)。你可以从大部分的内部部分'numel(arr)'开始,并且一步一步地将其他函数应用到它,以查看每个步骤中输入发生了什么。 – erfan

+0

谢谢。经过一些修改,它的工作。 :) – user3162506