matlab中inputparser,对函数的输入进行检查和解析

本文介绍了MATLAB中inputParser类的作用,用于函数输入参数的检查和解析,确保输入合规并提供清晰的错误信息。通过示例详细讲解了validateattributes和validatestring的使用,以及如何结合inputParser实现参数的可选、默认值和错误处理。此外,还讨论了inputParser在处理结构体输入和保证函数向后兼容性方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ae2fe7b4edf3997fef39645abed3cf2d.png

目录:

为什么要对函数的输入进行检查

在工程计算中,如果一个函数的输入有错误,我们总是希望能够尽早的通过对输入的检查,捕捉到这些错误,并及时终止程序。这样做的原因是,如果等到程序运行时出错或者运行结束后计算结果出错再查找,那就很迟了,而且通常debug的成本很高。在多人合作的项目中,如果一个开发人员提供了一个公用的API(应用程序接口)给别人使用,除了要提供说明文档规定输入的格式之外,API内部通常还需要对输入进行彻底的检查,因为开发人员不能保证每个使用者都会仔细地读文档,并且每次都能提供符合规定的数据,作为一个友好的API,一旦输入出了错,API应该及时提示用户,并且帮助诊断错误原因。同理,这样做的原因是,如果要等到程序运行时出错或者运行结束后计算结果出错,不但成本高,而且使用者也许根本无法查出错误的原因。

在MATLAB中,我们可以使用MATLAB提供的专门的函数validateattributes,validatestring和inputParser类来对输入进行检查。它们提供全面的检查功能和清晰的错误提示,是全套的参数检查解析方案。

validateattributes的基本使用

先介绍validateattributes的基本使用。假设在图像处理计算中,我们设计了一个函数叫做processImg ,用来对一张大小是500 x $500 的灰值图像进行处理,计算之前我们需要检查输入是否符合规定,这可以使用validateattributes函数来完成:

% 函数一开始检查输入变量的类型和尺寸

function processImg(img)

...

validateattributes(img,{'numeric'},{'size',[500,500]});

... % 函数继续

end

validateattributes的第一个参数img是输入的图像,即要检查的变量;第二个参数是要检查的类型,这里规定img必须是数值类型(numeric);第三个参数对变量要检查的属性,这里的属性是对img规定的尺寸。

validateattributes的最基本调用格式是:

validateattributes(A,classes,attributes)

其中classes和attributes通过元胞数组来指定,并且元胞中可以包括多个要检查的类型和属性,比如我们除了要检查图像的尺寸,还要检查该图像矩阵的值都在0到255之间,可以这样写:

%元胞数组中可以放置多个要检查的属性

...

validateattributes(img,{'numeric'},{'size',[500,500],'>=',0,'<=',255});

...

在这个例子中,要验证的类型是numeric,它是一个各种数值类型的集合,包括int8, int16, int32, int64, uint8, uint16, uint32, uint64,single,和double类型。当然我们可以让类型检查再具体一点,比如做数值积分的时候,我们通常要提供一个积分的网格,比如一维积分中的X轴,而且通常需要保证该x轴格点的值的类型是double,并是单调递增的,可以用validateattributes这样检查:

% 检查数据的类型是double且单增

...

validateattributes(xgrid,{'double'},{'increasing'})

...

validateattributes最少需要三个参数,如果我们只需要检查变量的类型,则第三个参数可以用空的元胞数组来代替。比如写一个阶乘的函数,其输入必须是无符号的整数,除此之外不做之外的其他检查,可以这样写:

% 第三个属性参数为空

...

validateattributes(iA,{'uint8'},{});

数据类型还可以是自定义的MATLAB类,比如下面一个简单的类MyClass

% MyClass

classdef MyClass

properties

myprop

end

end

如果要规定一个函数的输入是该类的对象, 可以这样写

% 要求变量obj是MyClass类的对象且非空

...

validateattributes(obj,{'MyClass'},{nonempty});

...

validateattributes的额外提示信息

在为什么要对函数的输入进行检查中我们提到,一个友好的API在用户输入出错时,应该提供清晰的诊断信息。以下面这个计算面积的API为例,它接受两个输入,分别是宽和高,计算就是把两者相乘返回:

% 一个简化的计算面积的函数

funciton A = getArea(width,height)

A = width*height;

end

显然,输入width和height必须是大于零的数值,所以我们先在函数中添加上validateattributes的基本调用形式:

function A = getArea(width,height)

validateattributes(width,{'numeric'},{'positive'});

validateattributes(height,{'numeric'},{'positive'});

A = width*height;

end

作为测试我们首先要试验该函数的各种合法输入(Positive Test),并且观察结果是否正确;然后还要测试非法的输入(Negative Test),验证函数确实能捕捉到错误,并且给出正确的诊断信息:

% 命令行测试函数功能

>> getArea(10,22)

ans =

220

>> getArea(10,0) % 如预期捕捉到了错误

Error using getArea (line 3)

Expected input to be positive.

>> getArea(0,22)

Error using getArea (line 2) % 两个错误信息除了行号,都是一样的

Expected input to be positive.

到这里我们发现,当第一个参数或者第二个参数不符合规定时,函数确实可以捕捉到错误,

但是提示的错误信息除了行号几乎是一样的(当然我们可以利用行号去检查getArea函数内部,然后发现到底是哪一个参数输入错误了。) ,检查错误还是有些不方便。这里我们可以使用validateattributes它的调用方法,能够提示更清晰的诊断信息,如下所示:

% validateattributes支持额外的诊断信息

function A = getArea(width,height)

validateattributes(width, {'numeric'},{'positive'},'getArea','width' ,1);

validateattributes(height,{'numeric'},{'positive'},'getArea','height',2);

A = width*height; %参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值