首页 > 解决方案 > 加快查找值之间的元素数 Matlab

问题描述

我创建了一个相当简单的 MATLAB 脚本来模拟Maths SE 上这个问题中讨论的行为。

clearvars;
samples = 1000;
x = 256;
r=exprnd(1/20e6,1,samples); % Generate exponentially distributed randoms.
endTime = sum(r);
quickMean=sum(r(1:x))/x; % Quick calc the mean and median.
quickMedian=0.693 * quickMean;
p = cumsum(r); % Convert event deltas into timestamps
bitstream = false(1,samples);
time = 0;
lastTime = 0;
for i = 1:samples
    lastTime = time;
    time = time + quickMedian;
    if (numel(p(p < time & p > lastTime)) > 0)
        bitstream(i) = true;
    end
    if (time > p(end))
        break
    end
end
ratio = sum(bitstream)/samples;

该脚本似乎有效,但是,如果我使用大量样本(比如一百万),这将是有益的,它真的会爬行。

我假设有问题的陈述是这个:

p(p < time & p > lastTime)

是否有更有效的方法来检查数组中的任何元素是否介于两个值之间?

标签: matlab

解决方案


让我们检查一下整个表达式:

numel(p(p < time & p > lastTime)) > 0

为了清楚起见,我们可以将其分开:

I = p < time & p > lastTime;
tmp = p(I);
n = numel(tmp);
n > 0

在这里,创建tmp是相当昂贵的:它查看哪里I是真的,然后将这些元素复制到一个新数组中。但是您对这个数组所做的唯一事情就是查看它有多少元素。逻辑n上将等于I. 而你并不真正需要这个数字,你只需要知道它是否大于 0。也就是说,你想知道其中的任何元素I是否为真。你可以这样做any

any(p < time & p > lastTime)

推荐阅读