【问题标题】:Cumsum until thresholdCumsum 直到阈值
【发布时间】:2014-04-26 19:33:37
【问题描述】:

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

例如

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 的速度,但允许我设置一个阈值。 任何的想法? 谢谢你

【问题讨论】:

  • 数据是来自normrnd 等已知分布还是仅用于说明?

标签: matlab sum cumsum


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    基本上,此解决方案结合了您的两个解决方案,它迭代大小为 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
    

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多