何时在Matlab中使用assert()?

由于Matlab被解释,通常会在执行函数签名的函数开头花费大量时间.例如

if nargin ~= 2; error('must provide two input args a and b'); end
if a < 0||a ~=floor(a); error('input arg1 must be positive non-zero integer'); end 
if ~isa(b,'cell') ...

相反,使用Matlab的assert()更好吗?如果没有,何时适合在Matlab中使用assert()?

关于在生产代码here中使用assert的讨论非常多,但我不确定这是否适用于解释代码.同样,另一个很好的讨论here和我同意@Dan Dyer关于断言以表达对当前状态的信念.然而,看看Python here的类似讨论人们说,只使用断言来应对永远不会发生的情况(例如异常情况的例外情况),这有点矛盾w.r.t.以前的参考文献.

也许这更像是一个关于断言在解释语言中扮演的角色的问题,而不是关于Matlab的问题.

在大多数情况下,两者之间没有区别

assert(X,...)

if (~X)
    error(...)
end

你在他们之间的选择是方便或风格的问题.

基于MATLAB的项目中非生产和生产代码之间的区别通常与基于其他语言的项目中的区别不同.

这部分是因为,正如你所说,MATLAB通常是解释而不是编译;虽然可以使用MATLAB Compiler或Builder产品生成应用程序,虽然没有严格“编译”,但是没有可见的源代码且无法调试.对于那些类型的应用程序,您需要像编译语言一样谨慎处理异常和错误.

部分原因还在于“生产”通常意味着使用MATLAB的项目与其他语言的项目不同;例如,它可能意味着MATLAB代码自动转换为C以部署到汽车引擎控制器,或者它可能意味着某些MATLAB代码正在运行财务预测模型并将结果写入生产数据库.

有一种特殊情况应该使用assert而不是if..error..end,这是当你使用MATLAB Coder从MATLAB代码生成C代码时. MATLAB编码器检查MATLAB代码中的断言语句,以推断它需要转换为C的变量的属性,并且如果它可以假设有关您断言的变量的事实(例如数组大小和类型),则可以生成更好的C代码.

最后一点:对于你提到的具体活动,强制执行函数签名,我不会使用任何方法 – inputParser通常更健壮和一致(虽然有点冗长),但更重要的是它鼓励你很好地设计函数签名.第一名.

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院