histc
アプローチについて質問した後、ここに投稿します。データを処理するだけの場合、これは最速の方法ではありませんが、後でビン情報 (データの分類) を再利用する必要がある場合に役立つ場合があります。
次のコード:
%% // prepare
clear all
t=1:10;
tnew=2:2:8;
data=1:10;
t(3)=[];
data(3)=[];
nLoop = 50000 ;
%% // initial method
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
for i=1:length(tnew)
datanew(i)=mean( data( find(t>=(tnew(i)-dt) & t<(tnew(i)+dt)) ));
end
end
toc
%% // initial method optimized
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
datanew = zeros( size(tnew) ) ;
for i=1:length(tnew)
datanew(i)=mean( data( t>=(tnew(i)-dt) & t<(tnew(i)+dt) ));
end
end
toc
%% // histc method
xedges = [tnew(1)-dt tnew+dt] ; %// => xedges = [1:2:9] ;
tic
for iLoop = 1:nLoop
clear newdata
newdata = zeros( size(tnew)) ;
[n,bins] = histc( data , xedges ) ;
for iBin=1:length(n)-1
newdata(iBin) = mean( data(bins==iBin) );
end
end
toc
次の出力が生成されます。
Elapsed time is 3.177801 seconds.
Elapsed time is 2.910844 seconds.
Elapsed time is 2.948526 seconds.
異なるループ反復回数で複数回実行しましたが、結果は常に一貫していました。最適化された初期メソッドは、常にhistcメソッドより高速です。私は histc メソッドの大ファンではありません。なぜなら、既にすべてのデータをビニングした後でも、data(bins==iBin)
直接のインデックス作成ではなく、ループと比較 ( ) が必要だからです。
ただし、比較はわずかに異なります。1 つはタイプ>
で、浮動小数点数を操作しますが、もう 1 つは=
インデックスを比較します (理論的には整数ですが、Matlab が内部でそれらをどのように表現するかはわかりませんので、メリットがない可能性があります)。
とにかく、これにより、より大きく複雑なデータセットで得た実行時間とは異なる結果になる可能性があるため、実際のデータでこれらのメソッドを試して、それがどのように機能するかをお気軽にお知らせください.
ps:最初の例を少し修正したので、平均時間ウィンドウに重複がなくなりました (変更されdt=1
、1 つが に変更され>
ました>=
)。このようにして、すべてのメソッドが同じ結果を返します。