range = min(x):0.0001:max(x);
N = numel(range);
x = sort(x);
hit = 0;
i=1;
for j = 1:(N-1)
if range(j) <= x(i) && x(i) < range(j+1)
hit = hit + 1;
i = i+1;
if x(i) == x(i-1)
while x(i) == x(i-1) % If there are more than one of the same
hit = hit + 1; % numbers in succession, this allows x and
i = i+1; % hit to carry on incrementing.
end %while
end %if
end %if
end %for
disp(hit)
此代码比较&#39;范围&#39;和&#39; x&#39;。它检查是否&#39; x&#39;在&#39;范围内的值之间,如果是这样的话,&#39;点击&#39;计数器增加,&#39; x&#39;。
的当前值也增加问题是,在x的一些随机值上(据我所知它们是随机的),尽管它们应该满足“IF”中的不等式。声明,&#39; IF&#39;语句被忽略,for循环继续,因此最后的命中&#39;价值是错误的。
&#39; X&#39;通常是大约一百万左右的一维阵列。
对于这个例子,让
`x = [-2.1792 -2.1759 -2.1758 -2.1748 -2.1658 -2.1648 -2.1646 -2.1604 -2.1603 -2.1550]`
&#39;打&#39;应该等于&#39; 10&#39;而是输出&#39; 2&#39;因为它决定跳过&#39; IF&#39;声明在&#39; j = 35&#39;。
澄清。当&#39; j = 35&#39;,范围(j)= -2.1758且i = 3意味着x(i)= - 2.1758
我非常确定:
range(j) <= x(i) && x(i) < range(j+1)
-2.1758 <= -2.1758 && -2.1758 < -2.1757 %**edited, meant -2.1757 not -2.1759**
是真的。
我希望我在这里做一些我无法看到的傻事。对不起,如果这是一个格式错误的问题,那么这是我的第一个问题。 提前干杯。
答案 0 :(得分:0)
后续号码x(i)
可以通过此测试:
if range(j) <= x(i) && x(i) < range(j+1)
实际上与其邻居相等:
if x(i) == x(i-1)
它可能会无限小,因此您移动到下一个j
并且它超出范围。您的内部while
需要与外部if
相同的条件。您可以跳过if COND while COND
,只需执行while COND
,因为它的工作原理相同。
答案 1 :(得分:0)
下面的代码会不会更简单,更快,并给出相同的结果吗?
x = sort(x)
hit = sum(diff(x)==0);