私はこの数十万行を持っています。私が欲しいのは、10行ごとに、その平均を取るかビンに入れたいということです。for ループを実行してこれを実装できますが、これには非常に長い時間がかかります。もっと直接的な方法はありますか?
質問する
5891 次
3 に答える
2
ベクトルの長さが 10 の倍数である限り、これは機能するはずです。
data = rand(100,1);
result = mean(reshape(data, 10, length(data)/10),1)
長さが 10 の倍数でない場合は、余分な要素をどうするかを決定し、そのための特別なケースを追加する必要があります。
アップデート
Rody のソリューションに着想を得て、最初の次元が 10 の倍数である限り、以下は任意の次元の行列で機能します。
data = rand(100,3,2);
sz = size(data);
result = squeeze(mean(reshape(data, [10 sz(1)/10 sz(2:end)]),1))
于 2012-11-16T17:13:43.110 に答える
1
または:
result = arrayfun(...
@(x) mean(data(x:min(x+9,end),:),1), ...
1:10:size(data,1), 'UniformOutput', false);
result = cat(1, result{:});
これは、の正確な行数に対する感度が少し低くなりdata
ます。最後に6行しかない場合は、それらの6行を平均します。
于 2012-11-16T18:01:55.560 に答える
1
y=smooth(x,10)
またはy=filter(ones(1,10), 1, x)
を使用してから を使用y(1:10:end)
して、10 番目の要素ごとに選択します。
于 2012-11-16T18:10:35.777 に答える