你如何在MATLAB中关闭断言?

时间:2013-10-10 23:36:52

标签: matlab assert

在调试我的MATLAB代码之后,我希望能够关闭断言,以便在可能的情况下获得一些额外的速度。 (断言中的表达式非常简短快速,但是在紧密循环中有很多调用,所以它加起来。是的,我描述了。)我如何在MATLAB中全局地做到这一点?我正在寻找类似于在C / C ++中定义NDEBUG,或在Python中启用优化,或在Java中使用-disableassertions标志的东西。使用assert(查找/替换%assert(对我来说太难看了。

1 个答案:

答案 0 :(得分:7)

在发布这些解决方案后,我发现虽然有效地禁用了断言,但它们并不会阻止表达式的执行。也许您可以利用逻辑表达式(true || expr)的短路来避免评估expr。这可以通过使用global NDEBUG代替true来完成。也就是说,使用assert(NDEBUG || expr),以便在exprNDEBUG时不会评估true。例如,

% parentCode.m (or typed on command prompt)
global NDEBUG; NDEBUG=true;
testassertions % test script below

% testassertions.m
global NDEBUG
if isempty(NDEBUG), NDEBUG=false; end
assert(NDEBUG || fprintf('NO\n')==2) % did fprintf write 3 characters? (no, 4)
disp('Assertions are off!')

要使用此方法,您显然需要修改assert调用以使用(NDEBUG || expr)方法,并且您将添加两行以引入global,就像完成一样在testassertions.m以上。这不是您正在寻找的“开关”,但它会避免计算expr,这似乎是这里的真正目标。

使用自定义assert.m

覆盖

您可以使用自己路径顶部的assert 覆盖assert.m。只需使用varargin即可使用:

function assert(varargin)
end

第一次运行它或rehash你的路径时,会收到警告,那就没关系了!

>> assert(false)
>> assert(false,'No error here',[])
>> 

没有错误,没有警告。

使用匿名assert

覆盖

可能更容易管理的是具有可变输入且无输出的匿名assert函数:

assert = @(varargin) deal;

我们使用的deal没有输入(nargin=0),因为它只是varargout = varargin;