2

しきい値が見つかるまで要素を合計し続ける高速な方法があるのだろうか。

例えば

threshold=100;
a=0; MAX=1000;
for i=1:MAX
    a=a+normrnd(2,1,1,1);
    if (a>threshold)
      index=i; break;
     end 
 end

これは問題なく動作しますが、かなり遅いです。Cumsum はここで非常に役立ちます。ただし、この状況で cumsum を使用する唯一の方法は次のとおりです。

a=cumsum(normrnd(2,1, MAX,1)); 
index=find(a>threshold,1);

MAXが増加すると、これは次第に非効率になります。

したがって、基本的に、cumsumの速度を維持しながらしきい値を設定できる累積合計法を探しています。何か案が?ありがとうございました

4

2 に答える 2

3

バイナリ検索を使用できます。要素が既知の分布を持つ確率変数、または少なくとも既知の期待値である場合、適切な初期推定を行うことができます。

あなたが投稿した場合、私たちはそれを持っています.50個の数字を生成してそれらを合計することE[normrnd(2,1,1,1)] = 2から始めます. threshold = 100過大評価すると、バイナリ検索で正しいインデックスを検索します。過小評価した場合は、過小評価した金額を使用して新しい推測を行い、過大評価するまでそれを続けます。

于 2014-04-26T20:26:35.830 に答える
1

基本的に、このソリューションは両方のソリューションを組み合わせ、サイズ 1000 のセグメントを反復処理し、cumsum ソリューションを使用して一度に 1000 要素を処理します。

threshold=100;
a=0; MAX=9999999;
%segment size
S=1000;
for segment_start=1:S:MAX
    %process segment from _start to _end
    segment_end=min(segment_start+S-1,MAX);
    %which contains _count elements
    segment_count=segment_end-segment_start+1;
    %now use the cumsum solution to process the segment
    c=normrnd(2,1,segment_count,1);
    c=cumsum(c);
    index=find(c>threshold-a,1,'first');
    if isempty(index)
        %need to continue
        a=a+c(end);
    else
        %threshhold reached, found solution
        a=a+c(index);
        break;
    end

end
于 2014-04-26T20:01:52.340 に答える