0

この関数を使用して、すべての要素が 1 であると想定される列ベクトルを取得していますが、n が大きくなった後、一部の要素が 1 でないことがあります。これはメソッドの制約によるものです。n の大きさを知りたいです。値を返します。問題は次のとおりです。1. 1 は 1.0000 として保存されているようです。変換方法と比較方法がわかりません (コメント内の場所) 2. ループを完全に終了する方法がわかりません。ありがとうございました。

function x = findn(n)

for m = 1:n
    [a,b]=Hilbert(m);
    m1 = GaussNaive(a,b);
    m2 = size(m1,1);
    % m1 is a n*1 matrix (a column vector) which every element is supposed 
    % to be 1, but when n gets large, some element is not 1.
    for i = 1:m2
        if (m1(i) ~= 1)
        % this compare isn't really working, since 1 is stored as 1.0000 for whatever
        % for whatever reason and they are not equal or not not equal.
        % I doubt whether it really compared.
        x = m;
        break;
        % it just exit the inner for loop, not entirely
        end
    end
end
4

1 に答える 1

0

Matlab では、すべての数値変数はデフォルトで倍精度浮動小数点数です。(実際には、文字列と論理も fp 番号のように見えることがありますが、今は忘れてください。) したがって、コードに表示されていない手順を実行しない限り、fp 番号を使用していることになります。int32実行できる手順には、変数をorなどの特定の型を持つように宣言することや、変数に対してuint16実行する算術演算に注意することが含まれます。倍精度浮動小数点に対する Matlab の魅力は非常に強く、int(たとえば) s を操作して、再び浮動小数点数に戻るのは簡単です。ドキュメントでこれらのタイプについて読み始めてください。

fp 数値に対する (不) 等値テストを回避する理由は、SO でほぼ毎日説明されています。繰り返しませんが、見て回ってください。コードを変更する簡単な方法は、テストを次のように置き換えることです。

if (m1(i) ~= 1)

if ((abs(m1(i)-1)>tol)

ここで、tolよりも大きい1+tol(または小さい) 任意の数が、目的のために1-tol等しくないと見なされるように、いくつかの小さな数です。1

残念ながら、私の知る限り、Matlab にはbreak、内側のループから包含ループの外側へのステートメントがありません。ただし、この場合、関数を呼び出した関数、またはそこから呼び出した場合はコマンドラインに制御を返す にbreak置き換えることができます。return

于 2013-02-16T08:23:25.797 に答える