2013-06-11 3 views
1

Я считаю себя писать такие вещи, как это много:Эквивалент isnumeric (X) & ~ isnan (X)?

if isnumeric(X) & ~isnan(X) 
    % etc etc 
end 

Прежде чем я загромождать пространство имен с моим собственным испытанием

function out = isanumber(X) 
    out = isnumeric(X) & ~isnan(X); 
end 

делает MATLAB уже есть эквивалентный тест?

ответ

3

Нет, нет.

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 
+0

Я считаю, что у вас есть опечатка с коротким замыканием '&&'. Функция 'isanumber' будет работать только для скаляров - в конце концов, это Matlab. – horchler

+1

@horchler: правда, я упустил это. Исправлено, спасибо! –

1

Более вероятно, что вы хотите isfinite(X).

Понятно, что это не совсем эквивалентно isnumeric(X) & ~isnan(X), это эквивалентно isnumeric(X) & ~isnan(X) & ~isfinite(X), но я предполагаю, что вы не хотите других особых случаев (плюс и минус бесконечность).

+2

'isfinite (X)' сам по себе не эквивалентен 'isnumeric (X) & ~ isnan (X) & ~ isfinite (X)'. 'isnumeric' фильтрует все, что не является числовым типом данных, но' isfinite ('a') 'и' isfinite (false) 'оба возвращают' true' для нечисловых аргументов. – horchler

+0

@horchler: Вы имеете в виду 'isnumeric', нет? Наверное, я слишком привык к C++, где char и bool считаются примитивными целыми типами –

Смежные вопросы