我有一個數組(大小2958的×1)。我想平均每五個單獨的元素開始並將結果存儲到一個新的數組中。例如:(非重疊移動)每n個元件的平均在載體
arr = (1:10).'; % for this array
avg = [3; 8]; % this should be the result
我該怎麼做?計算陣列中的每個n
元的平均
我有一個數組(大小2958的×1)。我想平均每五個單獨的元素開始並將結果存儲到一個新的數組中。例如:(非重疊移動)每n個元件的平均在載體
arr = (1:10).'; % for this array
avg = [3; 8]; % this should be the result
我該怎麼做?計算陣列中的每個n
元的平均
一種方法是使用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
方法可以無縫工作。
你能告訴我這個命令的含義,它是如何工作的 – user3162506
['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
謝謝。經過一些修改,它的工作。 :) – user3162506
你的意思的運行平均值 - 即,第一結果是數據的平均值(1:5),和第二平均的數據(2:6),或者說是第二結果數據的平均(6: 10)? – Dave
我應該在我的最後一條評論中說過,如果是第一個案例,請查看http://uk.mathworks.com/help/matlab/ref/filter.html,它將此作爲第一個工作示例。如果是第二個,那麼我會提出類似'mean(reshape(data,[],5),2);',但數據長度必須是5的倍數才能工作。 – Dave
@戴夫是的......第一個結果是(1:5)的平均值,第二個結果是(6:10)。並且是的數據應該是5的長度倍數,但它的長度不是5的倍數,那麼其餘的點(對於exp 3點在這種情況下仍然是2985以外)可以按照原樣添加到結果數組中。 – user3162506