解析函数输入
此示例说明如何定义必需和可选的输入、如何指定可选输入的默认值以及如何使用输入解析器验证自定义函数的所有输入。
输入解析器提供一致的方式来验证输入和指定输入的默认值,改进您的代码的稳定性和可维护性。要验证输入,您可以利用现有的 MATLAB® 函数或编写您自己的验证例程。
步骤 1.定义您的函数。
在名为 printPhoto.m
的文件中创建函数。printPhoto
函数具有文件名必需的一个输入,以及抛光(有光泽或无光泽)、颜色空间(RGB 或 CMYK)、宽度和高度的可选输入。
function printPhoto(filename,varargin)
在您的函数声明语句中,先指定必需的输入。使用 varargin
支持可选输入。
步骤 2.创建一个 inputParser 对象。
在您的函数内,调用 inputParser
以创建解析器对象。
p = inputParser;
步骤 3.将输入添加到方案中。
使用 addRequired
、addOptional
或 addParameter
将输入添加到您的函数中的解析方案中。为可选输入指定默认值。
对于每个输入,您可以指定验证函数的句柄,用于检查输入并返回标量逻辑值(true
或 false
)或错误。验证函数可以是现有的 MATLAB 函数(例如 ischar
或 isnumeric
)或您创建的函数(例如匿名函数或局部函数)。
在 printPhoto
函数中,filename
是必需的输入。将 finish
和 color
定义为可选输入,将 width
和 height
定义为可选的参数值对组。
defaultFinish = 'glossy'; validFinishes = {'glossy','matte'}; checkFinish = @(x) any(validatestring(x,validFinishes)); defaultColor = 'RGB'; validColors = {'RGB','CMYK'}; checkColor = @(x) any(validatestring(x,validColors)); defaultWidth = 6; defaultHeight = 4; addRequired(p,'filename',@ischar); addOptional(p,'finish',defaultFinish,checkFinish) addOptional(p,'color',defaultColor,checkColor) addParameter(p,'width',defaultWidth,@isnumeric) addParameter(p,'height',defaultHeight,@isnumeric)
您通过 addRequired
或 addOptional
添加的输入是位置性参数。调用具有位置性输入的函数时,按将它们添加到解析方案中的顺序来指定这些值。
通过 addParameter
添加的输入是非位置性的,因此您可以在 width
的值之前或之后传递 height
的值。但是,参数值输入要求您传递输入名称(height
或 width
)以及输入值。
如果您的函数接受可选的输入字符串或字符向量和名称-值参数,请为可选输入指定验证函数。否则,输入解析器将可选字符串或字符向量解释为参数名称。例如,checkFinish
验证函数确保 printPhoto
将 'glossy'
解释为 finish
的值,而不是无效的参数名称。
步骤 4.设置属性以调整解析(可选)。
默认情况下,输入解析器会假设是否大小写区分、函数名称、结构体数组输入以及是否允许使用方案中没有的其他参数名称和值。属性允许您显式定义这些行为。使用圆点表示法置属性,类似于向结构体数组赋值。
通过设置输入解析器的 KeepUnmatched
属性来使 printPhoto
接受与输入方案不匹配的其他参数值输入。
p.KeepUnmatched = true;
如果 KeepUnmatched
是 false
(默认值),输入解析器在输入与方案不匹配时发出错误。
步骤 5.解析输入。
在您的函数内,调用 parse
方法。传递所有函数输入的值。
parse(p,filename,varargin{:})
步骤 6.在您的函数中使用输入。
使用 inputParser
对象的以下属性访问解析的输入:
Results
- 包含方案中所有输入的名称和值的结构体数组。Unmatched
- 包含不在方案中而是传递到函数中的参数名称和值的结构体数组(当KeepUnmatched
是true
时)。UsingDefaults
- 具有特定的可选输入名称的元胞数组,由于这些可选输入名称未传递到函数,为它们指定了各自的默认值。
在 printPhoto
函数内,显示一些输入的值:
disp(['File name: ',p.Results.filename]) disp(['Finish: ', p.Results.finish]) if ~isempty(fieldnames(p.Unmatched)) disp('Extra inputs:') disp(p.Unmatched) end if ~isempty(p.UsingDefaults) disp('Using defaults: ') disp(p.UsingDefaults) end
步骤 7.调用您的函数。
输入解析器预期接收如下所示的输入:
首先是必需的输入,按照通过
addRequired
将它们添加到解析方案的顺序。可选输入,按照通过
addOptional
将它们添加到方案的顺序。参数名称-值对组输入之前的位置性输入。
Name1,Value1,...,NameN,ValueN
形式的参数名称和值。
将多个输入组合传递到 printPhoto
,其中一些为有效组合,一些为无效组合:
printPhoto('myfile.jpg')
File name: myfile.jpg Finish: glossy Using defaults: 'finish' 'color' 'width' 'height'
printPhoto(100)
Error using printPhoto (line 23) The value of 'filename' is invalid. It must satisfy the function: ischar.
printPhoto('myfile.jpg','satin')
Error using printPhoto (line 23) The value of 'finish' is invalid. Expected input to match one of these strings: 'glossy', 'matte' The input, 'satin', did not match any of the valid strings.
printPhoto('myfile.jpg',height=10,width=8)
File name: myfile.jpg Finish: glossy Using defaults: 'finish' 'color'
在 R2021a 之前使用名称-值参数时,将名称作为字符串或字符向量传递,并以逗号分隔名称和值。例如:
printPhoto('myfile.jpg','height',10,'width',8)
要传递第 n 个位置性输入的值,请指定前一个 (n – 1) 输入的值或以参数名称-值对组形式传递输入。例如,这些函数调用对 finish
(默认为 'glossy'
)和 color
赋予相同值:
printPhoto('myfile.gif','glossy','CMYK') % positional printPhoto('myfile.gif',color='CMYK') % name and value