在 Matlab 中,当尝试访问不存在的矩阵元素时,通常会引发错误:
>> month(0)
??? Subscript indices must either be real positive integers or logicals.
我想知道在这种情况下是否有允许提供默认值的功能。例如,:
>> get_def(month(0), NaN)
ans =
NaN
PS 我可以解决下标 ( ) 的这种特殊情况0
,但我想知道更通用的方法。
在 Matlab 中,当尝试访问不存在的矩阵元素时,通常会引发错误:
>> month(0)
??? Subscript indices must either be real positive integers or logicals.
我想知道在这种情况下是否有允许提供默认值的功能。例如,:
>> get_def(month(0), NaN)
ans =
NaN
PS 我可以解决下标 ( ) 的这种特殊情况0
,但我想知道更通用的方法。
一个优雅的解决方案是创建内置双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 帮助:
没有内置的 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