罗兰关于MATLAB的艺术

将想法转化为MATLAB

争论的时间

对于那些阅读本文的Monty Python粉丝,请查看论点诊所.最近两个肖恩次郎两次张贴关于新论据可用于输入参数检查的功能。我想向您展示更多关于这个伟大功能的信息!多年来,我也讨论过争论检查,包括本帖

内容

是什么让一个程序好或有用?

当然,这在用户的眼中是常见的,但如果您在误用程序时得到了有用的消息,这当然是有帮助的。这些信息应该有助于指导您正确地使用该程序,而不会有大麻烦。要做到这一点,程序员通常需要进行一些错误检查,考虑可能出现的错误,并确保在出现错误时提供正确的信息。

我将向你展示一些例程的代码片段。所讨论的函数是在给定参数(如感染率)的情况下,对病毒的动力学进行建模。

原始错误检查,大约2007年

在第一个代码中,我将向你展示12年前我们是如何做一些重要的错误检查的。在35行中,我们检查用户是否使用0、1或5个输入调用了该代码嵌入的函数。我们检查输入的类型。如果不是所有的输入都由用户提供,我们用默认值设置未提供的变量。

%考虑到在switch(nargin)案例5中变量的数量,t点=varargin{1};%在beta处评估的时间=varargin{2};%感染率c=varargin{3};%病毒清除率δ=varargin{4};%感染细胞的死亡率p=varargin{5};%感染细胞的病毒产生率案例1 t点=varargin{1};%在beta=3.4e-5时评估的时间;%感染率c=3.3;%病毒delta的清除率=3.4;%感染细胞的死亡率p=7.9e-3;%感染细胞的病毒生成率案例0%使用所有默认值Tpoints=0:0.1:10;%在beta=3.4e-5时评估的时间;%感染率c=3.3;%病毒delta的清除率=3.4;%de感染细胞的ath率p=7.9e-3;%感染细胞的病毒生产率否则错误('virusSolve:Input:InvalidNumberOfInputs',…'此函数需要0、1或5个输入');结束%错误检查-确保所有输入都是有效的validateattributes(Tpoints,{'numeric'},{'vector',non negative'},mfilename,'Tpoints',1);validateattributes(beta,{'numeric'},{'scalar',real'});validateattributes(c,{'numeric'},{'scalar',real'});validateattributes(delta,{'numeric'},{'scalar',real'});validateattributes(p,{'numeric'},{'scalar real',real'});

你可以看到大量使用赞扬以及使用函数输入变量数,开关,否则

另一个解决方案,类似的时间框架

在大约相同的时间范围内,使用一个名为输入分析器.下面是错误检查代码的样子。

%创建输入解析器ps=inputParser();%使用默认值定义可选参数并检查错误ps.addOptional('Tpoints',0:0.1:10,@(x)validateattributes(x,{'numeric'},{'vector',nonnegative'});ps.addOptional('beta',3.4e-5,…@(x)validateattributes(x,{'numeric'},{'scalar real'});ps.addOptional('c',3.3,…@(x)validateattributes(x,{'numeric'},{'scalar','real'});ps.addOptional('delta',3.4,…@(x)validateattributes(x,{'numeric'},{'scalar','real'});ps.addOptional('p',7.9e-3,…@(x)validateattributes(x,{'numeric'},{'scalar real','real'));%Parse(ps,varargin{:});%提取参数Tpoints=ps.Results.Tpoints;beta=ps.Results.beta;c=ps.Results.c;delta=ps.Results.delta;p=ps.Results.p;

如果你数一数,情况会好一点,我们从35减少到25。在本例中,您可以看到输入参数数量的限制被放宽了。现在它可以从0变为5。

和现代方式,大约2019年

在MATLAB版本2019b中,我们引入了一种执行输入参数验证的新方法,使用论据块,位于函数代码开头。下面介绍如何用35行代码,然后用25行代码完成之前的工作。

参数%R2019b或更新的Tpoints(1,:)double{mustBeNumeric,mustbennonegative}=0:0.1:10 beta(1,1)double{mustBeReal}=3.4e-5c(1,1)double{mustBeReal}=3.3 delta(1,1)double{mustBeReal}=3.4p(1,1)double{mustBeReal}=7.9e-3 end

在7行代码中,您可以看到我们为每个输入指定了所需的条件,并在缺少输入时提供一个默认值。

这只是一个简单的例子。你可以带来更多的素材论据.检查文档看到可能性。

你有争论吗?

你们是如何解决争论的?请让我知道在这里




发布与MATLAB®R2019b

|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。