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

一个优雅的解决方案是创建内置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函数。这是一种方法:

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 回答