你如何在MATLAB中关闭断言?

Nic*_*rca 6 matlab assert

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

cha*_*pjc 8

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

% 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!')
Run Code Online (Sandbox Code Playgroud)

要使用这种方法,您显然需要修改您的assert调用以使用该(NDEBUG || expr)方法,并且您将添加两行以引入global,testassertions.m如上所述.这不是你正在寻找的"开关",但它会避免计算expr,这似乎是这里的真正目标.

用自定义覆盖 assert.m

您可以路径顶部assert使用自己的覆盖.只是使用它会起作用:assert.m varargin

function assert(varargin)
end
Run Code Online (Sandbox Code Playgroud)

第一次运行它或rehash你的路径,你得到一个警告,那就没关系!

>> assert(false)
>> assert(false,'No error here',[])
>> 
Run Code Online (Sandbox Code Playgroud)

没有错误,没有警告.

用匿名覆盖 assert

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

assert = @(varargin) deal;
Run Code Online (Sandbox Code Playgroud)

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