matlab - 加快查找值之间的元素数 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)
是否有更有效的方法来检查数组中的任何元素是否介于两个值之间?
解决方案
让我们检查一下整个表达式:
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)
推荐阅读
- python - Django - 返回 Object 时,ManyRelatedManager 对象不可迭代
- elasticsearch - Elasticsearch 为相同的查询提供不同的搜索结果
- sql - 列出所有表格元素和 count() 即使 count 为 0
- c# - 更改 File.Copy 默认缓冲区大小。
- android - Android editText setError 文本被截断
- angular - 在字段列表字符串 Cloud Firestore 中查询
- shell - 命令行 - 删除包含内容的目录而不删除内容
- yii2 - 如何在 Windows 10 上使用 vagrant 安装 yii2?
- php - Silverstripe 4 中类扩展 UserDefinedForm 的问题
- python - Matplotlib Semilogy 表示数据是否定的