1

我发现自己经常写这样的东西:

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

在我用自己的测试弄乱命名空间之前

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

MATLAB 是否已经进行了等效测试?

4

2 回答 2

3

不,没有。

NaN是一个数字类(double默认情况下,符合 IEEE754),当isnumeric通过. 我会立即承认看似微不足道的trueNaN

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
于 2013-06-11T19:53:19.383 回答
2

多半是你想要isfinite(X)的。

诚然,它不完全等同于isnumeric(X) & ~isnan(X),它等同于isnumeric(X) & ~isnan(X) & ~isinf(X),但我猜你也不想要其他特殊情况(正负无穷大)。

于 2013-06-11T20:43:56.850 回答