2016-04-12 10 views
0

私はaとbの間の関数を統合できるはずの関数をプログラミングしています。キャッチ関数は、対応する時刻を持つデータ配列によってのみ提供されるということです。データを取り出すための最速の方法

問題は、この時間枠内にあるデータベクトルの部分を下限と上限で切り捨てなければならないときです。私の質問は、これが最も効率的です。私が今やっている何を

は以下の通りです:

llim = find(time==lima); 
ulim = find(time==limb); 

data = data(llim:ulim); 
int1 = h/2*(data(1) + data(end) + 2*sum(data(2:end))); 

しかし、プロファイラによると50代の%は、最初の3つのラインで使用されているので、それはそれは素晴らしいことだ減らすことができれば。

私も

data = data(time>=lima & time<=limb); 

を使用して試してみましたが、それは速くありません。助言がありますか?

+4

あなたが 'データ=データ(時間> =リマ&時間を<=四肢)'を意味するものではありません。ここでは、ランダムな時間差で1E3の長さのベクトルのための分析ですか? 'lima'は' limb'よりも右でしょうか? – Dan

+0

あなたが試したオプションを分割することがありますか?違いはありませんが、誰が知っていますか? 'data = data(time> = lima); data = data(time <= limb); ' – Swier

+1

@Danあなたは完全に正しいです。私はすぐにそれを再入力して、私が試したと言っていました。 –

答えて

2

ボトムライン、論理条件ラインが勝ちます。

N=1e3; 
data=rand(1,N); 

time=1:N; 
for n=1:100 

    li=sort(randi(N,2,1)) ; 

    llim = find(time==li(1)); 
    ulim = find(time==li(2)); 

    f1 = @() data(find(time==li(1)): find(time==li(2))); 
    f2 = @() data(time>=li(1) & time<=li(2)); 
    d(n)=diff(li); 
    t1(n)=timeit(f1); 
    t2(n)=timeit(f2); 
end 

%% 
plot(d,t1,'s',d,t2,'o'); 
xlabel('llim-ulim'); 
ylabel('time (sec)'); 
legend('find method','logical cond method'); 

enter image description here

関連する問題