2

10 分間隔で取得したデータがありますが、多くのデータ ギャップがあり、均一な時間グリッドで平均化したいと考えています。各時間の両側で 3 つの潜在的なポイントを取得し、それらを 1 時間に平均化する効率的な方法を探しています。

例:

t_old = [1:35 1:45 1:55 -- 2:15 2:25] %here -- データがありません

t_new = 2:00

data_old = [1 2 3 -- 5 6]

data_new = 3.4

問題は、十分なデータギャップがあることです。単純なビン平均だけではできません。新しい時間ステップごとに移動し、その 30 分のオフセットで find() を使用することでそれを実行できることはわかっていますが、それは恐ろしく非効率的で遅いと感じています。これを行うためのより迅速な方法に関するアイデアはありますか? おそらく、最も近い時間にビン化してからビンを平均化する方法はありますか?

MWE の編集:

t=1:10; 
tnew=2:2:8;
data=1:10; 
t(3)=[];
data(3)=[];
dt=2; 
for i=1:length(tnew)
    datanew(i)=mean(data(find(t>(tnew(i)-dt) & t<(tnew(i)+dt)))); 
end

datanew
4

2 に答える 2

1

アプローチ #1

tnew_lb = tnew-dt; %// lower bound
tnew_ub = tnew+dt; %// upper bound
[r,c] = find(bsxfun(@gt,t',tnew_lb) & bsxfun(@lt,t',tnew_ub));
datanew = accumarray(c,data(r),[], @mean)

アプローチ #2

timestep = min(diff(t)); %// Minimum time-stepsize for t
t_all = min(t):timestep:max(t); %// create all the timesteps
[b1,b2] = ismember(t,t_all);

ind = bsxfun(@plus,[tnew(1)-dt+1:tnew(1)+dt-1]',[0:numel(tnew)-1]*dt);
[v1,v2] = ismember(ind,t_all(b2));
vind = v2~=0;
v2(v2==0) = NaN;
v2(vind) = data(v2(vind));
out = nanmean(v2);
于 2014-09-11T18:39:07.907 に答える
1

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 つが に変更され>ました>=)。このようにして、すべてのメソッドが同じ結果を返します。

于 2014-09-12T10:29:39.293 に答える