1

私はこの数十万行を持っています。私が欲しいのは、10行ごとに、その平均を取るかビンに入れたいということです。for ループを実行してこれを実装できますが、これには非常に長い時間がかかります。もっと直接的な方法はありますか?

4

3 に答える 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 に答える