matlab - 如何关闭 MATLAB 中的断言?

标签 matlab assert

在调试完我的 MATLAB 代码后,我希望能够关闭断言以获得额外的速度(如果可能的话)。 (断言中的表达式非常短且快速,但在紧密循环中有很多调用,所以它加起来。是的,我分析过。)我如何在 MATLAB 中全局执行此操作?我正在寻找类似于在 C/C++ 中定义 NDEBUG 或在 Python 中启用优化或在 Java 中启用 -disableassertions 标志的东西。查找/替换 assert(%assert( 对我来说太丑了。

最佳答案

在发布这些解决方案后我突然想到,虽然有效地禁用了断言,但它们并没有阻止表达式的执行。或许您可以利用逻辑表达式的短路 (true || expr) 来避免计算 expr。这可以通过使用 global NDEBUG 代替 true 来完成。也就是说,使用 assert(NDEBUG || expr) 这样当 NDEBUGtrue 时,将不会计算 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/

相关文章:

ios - ShareKit 断言 : "ShareKit has been refactored to be used as Xcode subproject."

java - JUnit 断言失败时的自定义消息

testing - 如何通过多个步骤执行集成测试

PHPUnit:断言两个数组相等,但元素的顺序并不重要

matlab - Octave 的矢量解包

matlab - 神经网络优化与遗传算法

c - 为什么使用 NDEBUG 而不是 RELEASE?

matlab - 最速下降求解具有希尔伯特矩阵的线性系统

python - Python 和 Matlab 中的克罗内克积

matlab - 从文件中读取矩阵时禁止打印