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)

このコードは、「range」と「x」を比較します。'x' が 'range' の値の間にあるかどうかを確認します。そうであれば、'hit' カウンターがインクリメントされ、'x' の現在の値もインクリメントされます。

問題は、x のいくつかのランダムな値 (ランダムであることがわかる限り) では、「IF」ステートメントの不等式を満たす必要がありますが、「IF」ステートメントは無視され、for ループが継続し、最終的な'hit' 値が間違っています。

「x」は通常、幅が約 100 万程度の 1D 配列です。

この例では、

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

'hit' は '10' に等しくなければなりませんが、'j=35' で 'IF' ステートメントをスキップすることを決定したため、代わりに '2' を出力します。

明確にするために。'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 = sort(x)
hit = sum(diff(x)==0);
于 2013-12-20T19:32:44.783 に答える
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 に答える