1
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)

此代码比较“范围”和“x”。它检查“x”是否在“范围”中的值之间,如果是,“命中”计数器会增加,“x”的当前值也会增加。

问题是,在 x 的一些随机值上(据我所知它们是随机的),虽然它们应该满足“IF”语句中的不等式,但“IF”语句被忽略,for 循环继续,因此最终“命中”值是错误的。

“x”通常是一个大约一百万左右宽的一维数组。

对于这个例子,让

`x = [-2.1792 -2.1759 -2.1758 -2.1748 -2.1658 -2.1648 -2.1646 -2.1604 -2.1603 -2.1550]`

'hit' 应该等于 '10' 但输出 '2' 因为它决定跳过 'j=35' 处的 'IF' 语句。

澄清。当 'j=35' 时,range(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**

是真的。

我希望我只是在这里做一些我看不到的愚蠢的事情。抱歉,如果这是一个格式错误的问题,这是我的第一个问题。提前喝彩。

4

2 回答 2

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因为它的工作原理是一样的。

于 2013-12-20T17:54:25.430 回答
0

下面的代码会不会更简单、更快并给出相同的结果?

x = sort(x)
hit = sum(diff(x)==0);
于 2013-12-20T19:32:44.783 回答