在调试了我的 MATLAB 代码之后,如果可能的话,我希望能够关闭断言以获得一些额外的速度。(断言中的表达式非常简短快速,但是在紧密循环中有很多调用,所以它加起来了。是的,我分析了。)如何在 MATLAB 中全局执行此操作?我正在寻找类似于NDEBUG
在 C/C++ 中定义、在 Python 中启用优化或-disableassertions
在 Java 中标记的东西。查找/替换assert(
为%assert(
我的口味太难看。
问问题
1251 次
1 回答
9
在发布这些解决方案后,我突然想到,虽然有效地禁用了断言,但它们并没有阻止表达式的执行。也许您可以利用逻辑表达式 () 的短路true || expr
来避免计算expr
. 这可以通过使用 aglobal NDEBUG
代替 that来完成true
。也就是说,使用assert(NDEBUG || expr)
这样在isexpr
时不会被评估。例如,NDEBUG
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;
。
于 2013-10-10T23:51:30.487 回答