配列(サイズ2958 x 1)を持っています。私は開始から5つの別々の要素を平均し、その結果を新しい配列に格納したいと考えています。例:(非重複移動)ベクトル内のn個の要素の平均値
arr = (1:10).'; % for this array
avg = [3; 8]; % this should be the result
どうすればいいですか?アレイ内のすべてのn
要素の平均を計算する
配列(サイズ2958 x 1)を持っています。私は開始から5つの別々の要素を平均し、その結果を新しい配列に格納したいと考えています。例:(非重複移動)ベクトル内の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);
違いは大きいです:
------------------- 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番目がデータの平均(2:6)、ORが2番目の結果の平均データ(6: 10)? – Dave
最初のケースであれば、私の最後のコメントで述べたはずです。http://uk.mathworks.com/help/matlab/ref/filter.htmlを見てください。 2番目の場合、私は '平均(reshape(data、[]、5)、2);'のようなものを提案しますが、データはこれが動作するためには5の倍数でなければなりません。 – Dave
@ Daveはい。最初の結果は平均(1:5)で、2番目の結果は(6:10)です。はい、データの長さは5の倍数でなければなりませんが、長さが5の倍数でない場合、残りのポイント(この場合は3ポイントが2985のまま残ります)をそのまま結果配列に追加できます。 – user3162506