首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cumsum直到阈值

Cumsum直到阈值
EN

Stack Overflow用户
提问于 2014-04-26 19:33:37
回答 2查看 478关注 0票数 2

我想知道是否有一种快速的方法来不断求和一个元素,直到找到一个阈值。

例如

代码语言:javascript
运行
复制
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

这个很好,但速度很慢。卡姆苏姆在这里会很有用。不过,在这种情况下,我唯一知道使用累积和的方法是:

代码语言:javascript
运行
复制
a=cumsum(normrnd(2,1, MAX,1)); 
index=find(a>threshold,1);

随着最大值的增加而变得越来越低效。

因此,基本上,我正在寻找一个累积求和方法,保持累积和的速度,但这允许我设置一个阈值。有什么想法吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-26 20:01:52

基本上,这个解决方案结合了您的两个解决方案,它在大小为1000的段上迭代,并使用累积和解决方案同时处理1000个元素。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-04-26 20:26:35

您可以使用二进制搜索。如果您的元素是具有已知分布的随机变量,或者至少是已知的期望值,那么您可以进行良好的初始猜测。

在您已经发布的例子中,我们有这个E[normrnd(2,1,1,1)] = 2,从threshold = 100开始,您首先生成50个数字并对它们进行求和。如果估计过高,则使用二进制搜索搜索正确的索引。如果你低估了,那么你就用你低估的数量来做一个新的猜测,然后继续这样做,直到你高估为止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23315586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档