2016-09-22 64 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