2016-09-22 16 views
1

配列(サイズ2958 x 1)を持っています。私は開始から5つの別々の要素を平均し、その結果を新しい配列に格納したいと考えています。例:(非重複移動)ベクトル内のn個の要素の平均値

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

どうすればいいですか?アレイ内のすべてのn要素の平均を計算する

+0

最初の結果がデータの平均(1:5)で、2番目がデータの平均(2:6)、ORが2番目の結果の平均データ(6: 10)? – Dave

+0

最初のケースであれば、私の最後のコメントで述べたはずです。http://uk.mathworks.com/help/matlab/ref/filter.htmlを見てください。 2番目の場合、私は '平均(reshape(data、[]、5)、2);'のようなものを提案しますが、データはこれが動作するためには5の倍数でなければなりません。 – Dave

+0

@ Daveはい。最初の結果は平均(1:5)で、2番目の結果は(6:10)です。はい、データの長さは5の倍数でなければなりませんが、長さが5の倍数でない場合、残りのポイント(この場合は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); 

違いは大きいです:

------------------- 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

関連する問題