6

在大多数 OO 语言中,变量可能指向对象,它们也可能有一个空值,这非常方便。

在 Matlab 中,我有一个函数,它解析一个命令,然后返回一个单元格数组,或者false(等于零 - 这是另一种常见模式)如果它失败:

function re = parse(s)
    ...
    if (invalid)
        re = false;
        return;
    end
end

问题是当我检查结果时,它给出了一个错误:

re = parse(s);
if (false == re)
Undefined function 'eq' for input arguments of type 'cell'.

我已经编写了一个函数来检查它而不会出现错误:strcmp('logical', class(re)) && false == re,但是在代码的热点区域使用这似乎真的很慢,而且如果我必须将此函数添加到我正在编写的每个 M 文件中也很不方便。

使用NaN更糟糕,因为除了抛出该错误之外,它也不等于自身。

与此模式一起使用的更好选择是什么?

4

5 回答 5

3

一个不错的选择是使用空数组:[]isempty(re)检查。这不会引发错误。

参考: http: //www.mathworks.com.au/matlabcentral/newsreader/view_thread/148764

于 2013-03-14T04:02:05.547 回答
3

您可以使用该isequal函数比较任何两个项目而不会导致该错误。例如:

if isequal (re, false)
    %code here
end
于 2013-03-14T06:17:20.303 回答
1

如果您可以更改函数,parse一种解决方案是返回两个输出参数[re status] = parse(s),其中status将是逻辑变量。如果成功则将其设置为 true,否则设置为 false。

于 2013-03-14T04:10:35.630 回答
1

{}如果它不是有效结果,我将使用空单元格数组。使用空矩阵是 MATLAB 标准(请参阅 Evgeni Sergeev 的回答),但使用空元胞数组而不是空数值数组可确保您始终得到相同类型的结果。

另一方面,如果空单元格数组{}是您的函数的有效结果,那么我将使用异常来表示问题:

if invalid
    error('Parse:InvalidArgumentError', 'The input is invalid.');
end

确保使用适当的错误 ID( 的第一个参数error),以便在调用函数时可以准确捕获该异常:

try:
    result = parse(something);
catch ME
    if strcmp(ME.identifier, 'Parse:InvalidArgumentError')
        fprintf('Ooops\n');
    else
        % Some other error
        ME.rethrow();
    end
end
于 2013-03-14T07:54:10.900 回答
0

我认为问题在于matlab函数不返回指针而是值的副本。

恕我直言,最好的方法是定义自己的“指针”类。在里面你可以定义一个“isNull()”命令,甚至覆盖比较来产生你想要的行为。

于 2013-03-14T06:34:32.720 回答