Нет, нет.
NaN
имеет числового класса (double
по умолчанию, соответствующей IEEE754), что делает isnumeric
вычисляться true
, когда прошел NaN
. Я сразу же признать, что, казалось бы, тривиальное
isnumeric (not a number)
фактически дает истинный несколько нелогичным, но это имеет смысл, когда вы читаете большие объемы данных из файла, например, и некоторые элементы из матриц, прочитанных таким образом, NaN
(отсутствует, неверно преобразовано или аналогично) - в таких случаях было бы довольно darn annoying, если 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
Я считаю, что у вас есть опечатка с коротким замыканием '&&'. Функция 'isanumber' будет работать только для скаляров - в конце концов, это Matlab. – horchler
@horchler: правда, я упустил это. Исправлено, спасибо! –