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

您可以使用二进制搜索。如果您的元素是具有已知分布的随机变量,或者至少是已知的预期值,您可以做出很好的初步猜测。

在您发布的情况下,我们有E[normrnd(2,1,1,1)] = 2,因为threshold = 100您首先生成 50 个数字并将它们相加。如果您高估了,那么您使用二进制搜索来搜索正确的索引。如果您低估了,那么您使用您低估的金额进行新的猜测,并继续这样做,直到您高估。

于 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 回答