我发现自己经常写这样的东西:
if isnumeric(X) & ~isnan(X)
% etc etc
end
在我用自己的测试弄乱命名空间之前
function out = isanumber(X)
out = isnumeric(X) & ~isnan(X);
end
MATLAB 是否已经进行了等效测试?
我发现自己经常写这样的东西:
if isnumeric(X) & ~isnan(X)
% etc etc
end
在我用自己的测试弄乱命名空间之前
function out = isanumber(X)
out = isnumeric(X) & ~isnan(X);
end
MATLAB 是否已经进行了等效测试?
不,没有。
NaN
是一个数字类(double
默认情况下,符合 IEEE754),当isnumeric
通过. 我会立即承认看似微不足道的true
NaN
isnumeric ( not a number )
实际上给出true有点违反直觉,但是当您从文件中读取大量数据时,它非常有意义,因此读取的矩阵的某些元素是NaN
(丢失、错误转换或类似)——在这种情况下,如果再这么说的话,那就太烦人了。isnumeric(NaN)
false
所以像往常一样,这一切都取决于你如何看待它。MathWorks 决定(很可能经过大量研究后)认为返回有意义的案例true
比相反的案例要多得多。因此,恐怕您必须始终手动测试这两种情况。
顺便说一句,如果你只是把它变成一个子函数或嵌套函数,你就不会那么混乱了:
% All in the same file:
function varargout = main(varargin)
% Delegate checking, parsing, etc. the input arguments
% to a subfunction
[varargin{1:nargin}] = parseInputArguments(varargin{:});
% ...So you can just go on and do all your main stuff here
% without all the usual clutter of parsing the arguments
end
% Main's argument parser
function varargout = parseInputArguments(varargin)
% ...parse all sorts of stuff here
% the readable test:
if isanumber(varargin{2})
varargout{2} = rand(5); end
% ...parse more stuff here
% nested helper function to aid readibility without
% polluting the main function namespace too much
function yn = isanumber(x)
yn = isnumeric(x) & ~isnan(x);
end
end
多半是你想要isfinite(X)
的。
诚然,它不完全等同于isnumeric(X) & ~isnan(X)
,它等同于isnumeric(X) & ~isnan(X) & ~isinf(X)
,但我猜你也不想要其他特殊情况(正负无穷大)。