3

Matlab では、存在しない行列の要素にアクセスしようとすると、通常、エラーが発生します。

>> month(0)
??? Subscript indices must either be real positive integers or logicals.

そのような場合にデフォルト値を提供できる機能があるかどうか疑問に思っていました。例えば、:

>> get_def(month(0), NaN)
ans =
   NaN

PS この特定の添え字 ( 0) のケースを回避できますが、これを行うより一般的な方法について疑問に思っていました。

4

2 に答える 2

3

洗練された解決策は、組み込みdouble MATLAB クラスのサブクラスを作成し、subsrefメソッドをオーバーロードすることです。

classdef myDouble < double

    methods

        function obj = myDouble(val)
            obj = obj@double(val);
        end

        function val = subsref(obj, S)
            try
                val = subsref@double(obj, S);
            catch
                val = NaN;
            end
        end

    end

end

次に、このクラスを次のように使用できます。

>> a = myDouble(1:10);
>> a(1:3)

ans = 
  myDouble
  double data:
     1     2     3

  Methods, Superclasses

>> a('asdsa')

ans =
   NaN

>> a({1, 'asdf'})

ans =
   NaN

サブクラスは double クラスから継承するため、doubleクラスのすべての機能とカスタムmyDoubleクラスの追加機能を引き続き利用できます。

以下の MATLAB ヘルプを参照してください。

于 2009-08-15T00:17:40.257 に答える
2

必要なことを実行するための組み込みのMATLAB関数はありません。try-catchブロックを使用できます。

>> try a = month(0); catch a = nan; end
>> a

a =

   NaN

ただし、おそらく最良のオプションは、最初にインデックスをエラーチェックするか、エラーをスローするか、変数が範囲外の場合はデフォルト値に設定することです。

本当に0のインデックスを使用してみたい場合は、独自のget_def関数を作成できます。これを行う1つの方法は次のとおりです。

function value = get_def(vector,index,defaultValue)
  try
    value = vector(index);
  catch
    value = defaultValue;
  end
end

次に、この関数を次のように使用します。

>> month = 1:12;
>> get_def(month,0,nan)

ans =

   NaN

>> get_def(month,1,nan)

ans =

     1
于 2009-08-13T14:35:59.583 に答える