6

ほとんどの OO 言語では、変数がオブジェクトを指す可能性があり、非常に便利な null 値を持つこともできます。

Matlab には、コマンドを解析してセル配列を返す関数があります。または、false失敗した場合は (ゼロに等しい - これは別の一般的なパターンです) を返します。

function re = parse(s)
    ...
    if (invalid)
        re = false;
        return;
    end
end

問題は、結果を確認するとエラーが発生することです。

re = parse(s);
if (false == re)
Undefined function 'eq' for input arguments of type 'cell'.

エラーなしでそれをチェックする関数を作成しました: strcmp('logical', class(re)) && false == re、しかし、コードのホットな領域で使用するには非常に遅く、また、作成しているすべての M ファイルにこの関数を追加する必要がある場合は不便です。

NaNそのエラーをスローするだけでなく、それ自体と等しくないため、使用はさらに悪いです。

このパターンで使用するためのより良い代替手段は何ですか?

4

5 に答える 5

3

この関数を使用して、isequalそのエラーを発生させずに任意の 2 つの項目を比較できます。例えば:

if isequal (re, false)
    %code here
end
于 2013-03-14T06:17:20.303 に答える
3

良い代替手段は、空の配列を使用し[]isempty(re)チェックすることです。これはエラーをスローしません。

参照: http://www.mathworks.com.au/matlabcentral/newsreader/view_thread/148764

于 2013-03-14T04:02:05.547 に答える
1

{}それ以外の場合は有効な結果でない場合は、空のセル配列を使用します。空の行列の使用は MATLAB 標準です (Evgeni Sergeev の回答を参照) が、空の数値配列の代わりに空の cell 配列を使用すると、常に同じタイプの結果になることが保証されます。

一方、空のセル配列{}が関数の有効な結果である場合は、例外を使用して問題を通知します。

if invalid
    error('Parse:InvalidArgumentError', 'The input is invalid.');
end

error関数を呼び出すときにその例外を正確にキャッチできるように、適切なエラー ID ( の最初の引数) を使用してください。

try:
    result = parse(something);
catch ME
    if strcmp(ME.identifier, 'Parse:InvalidArgumentError')
        fprintf('Ooops\n');
    else
        % Some other error
        ME.rethrow();
    end
end
于 2013-03-14T07:54:10.900 に答える
1

関数を変更できる場合、 1 つの解決策は、論理変数になるparse2 つの出力引数を返すことです。成功した場合は true に設定し、それ以外の場合は false に設定します。[re status] = parse(s)status

于 2013-03-14T04:10:35.630 に答える
0

問題は、matlab 関数がポインターではなく値のコピーを返すことだと思います。

私見の最良の方法は、独自の「ポインター」クラスを定義することです。内部では、「isNull()」コマンドを定義したり、比較をオーバーライドして、必要な動作を生成したりできます。

于 2013-03-14T06:34:32.720 に答える