在调试完我的 MATLAB 代码后,我希望能够关闭断言以获得额外的速度(如果可能的话)。 (断言中的表达式非常短且快速,但在紧密循环中有很多调用,所以它加起来。是的,我分析过。)我如何在 MATLAB 中全局执行此操作?我正在寻找类似于在 C/C++ 中定义 NDEBUG
或在 Python 中启用优化或在 Java 中启用 -disableassertions
标志的东西。查找/替换 assert(
为 %assert(
对我来说太丑了。
最佳答案
在发布这些解决方案后我突然想到,虽然有效地禁用了断言,但它们并没有阻止表达式的执行。或许您可以利用逻辑表达式的短路 (true || expr
) 来避免计算 expr
。这可以通过使用 global NDEBUG
代替 true
来完成。也就是说,使用 assert(NDEBUG || expr)
这样当 NDEBUG
为 true
时,将不会计算 expr
>。例如,
% 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.m
覆盖 assert
。只需使用 varargin
即可:
function assert(varargin)
end
第一次运行它或重新散列
您的路径时,您会收到警告,然后就可以了!
>> assert(false)
>> assert(false,'No error here',[])
>>
没有错误,没有警告。
用匿名断言
覆盖
可能更容易管理的是具有可变输入但没有输出的匿名断言
函数:
assert = @(varargin) deal;
这里我们使用没有输入 (nargin=0
) 的 deal
,因为它只是执行 varargout = varargin;
。
关于matlab - 如何关闭 MATLAB 中的断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19307991/