- \. f8 T' R6 Z p.parse(width,varargin{:}); / I( p b3 ^$ o5 U( n, R0 `7 x 2 Z. Z: m7 v; {$ b
a = p.Results.width*p.Results.height;7 j% M* C5 \' ?& B ` R& k
end $ D( U ^, u, w* O3 S7 `) W+ _$ v这个版本的getArea的语法要点如下: $ T+ L5 ^8 q% Z* E$ e第1行中的参数被分成了两个部分,第一个输入width和其余的部分,其余部分的参数被包装在了元胞数组中,后面还会看到更多这样的例子。 8 ^5 @8 J6 g w第7行指定了可选参数的默认值。0 t" E* Z& Y' E! L' J2 ] q( c
第8行给inputParser添加了height作为可选参数 , Q1 L1 Y0 @6 C: ~5 p9 U6 |下面在命令行尝试该函数的各种输入,并且检查结果: 8 b6 X3 [& L% P" p I% 命令行测试函数功能 5 ~; I* V5 |7 e( o' W* v' z- G- Y>> getArea(10) % 正确处理的了单个参数的情况( ` Q$ g5 f6 H! S
ans = ! S) w5 ]) k* [3 @/ s 1001 g! \$ X9 ?8 j
. M- a# `2 U/ g) ?>> getArea(10,22) % 确保仍然可以处理两个参数的情况 4 c$ g2 @. f1 e& F8 wans = # D% I6 \7 @3 g 220* }0 b& ~7 L3 i: y+ @" E
inputParser和validateattributes联合使用 : \$ y3 U# t2 P- a2 z! {) H9 jinputParser的主要功能是对多个输入参数的解析,其对每个参数的值的检查可以使用匿名函数, 而检查参数的值正是我们前面介绍的validateattributes和validatestring函数的强项,这节中我们把inputParser和validateattributes联合起来使用。1 j9 Q/ |0 t- |) N
% getArea版本2 ; a, D9 R& {# c8 V
function a = getArea(width,varargin)+ r: w( S* d$ X+ r+ |; ]
6 o' Z; o; M: E) M, z p = inputParser; - Y3 l6 _* [" Z* ^3 l9 L D' i p.addRequired('width',@(x)validateattributes(x,{'numeric'},... ' N! T% M0 l: T$ g& l9 y+ [ {'nonzero'},'getArea','width',1));( g2 J% Y0 i/ a U4 O# O. z3 e- O3 K" K
. B9 N" B% n: D7 I2 u8 G , k& n# Y* c% D" R. q3 o( _' w8 K defaultheight = width; 3 Z& o$ A8 z2 N4 d! m7 K9 N p.addOptional('height',defaultheight,@(x)validateattributes(x,{'numeric'},... 9 z" }7 O5 F/ ~* w" L8 D6 o {'nonzero'},'getArea','height',2)); ! \0 f0 a0 Q( {$ ~7 P5 s1 J1 g3 O" t # U" }' D9 G3 K! \ p.parse(width,varargin{:}); % 注意要把varargin元胞中的内容解开提供给parse函数 : X5 a- R3 f( ~ ! t; z# R' p' t2 \- x. o
a = p.Results.width*p.Results.height; . K1 E8 P! p5 @) d! A* V2 Kend 8 ?7 Z2 E6 q7 Z' T9 E+ ~
其中validateattributes使用了validateattributes带额外参数的调用格式。如果调用出错,会提示额外诊断信息。 下面在命令行尝试该函数的各种输入,并且检查结果: / ?3 Z% r( R0 I7 a4 q % 命令行测试函数功能 ; U( P1 @, v/ m$ S* q) n, X* T>> getArea(10,0) % 如预期检查出第二个参数的错误,并给出提示: @" D4 U- m A9 @3 o
Error using getArea (line 37)/ D$ `. y$ K) P
The value of 'height' is invalid. Expected input number 2, height, to be nonzero. 2 Z) G( X, [. k. W. X3 D) k" \2 Q8 S$ A- _( b! E& d, x3 Q) y1 k1 A
>> getArea(0,22) % 如预期检查出第一个参数的错误,并给出提示 A9 U9 w4 o8 C8 ^Error using getArea (line 37) 1 H% ?! v% L8 f1 LThe value of 'width' is invalid. Expected input number 1, width, to be nonzero.* S/ P1 e! T" F2 C: L6 i* D1 e
inputParser的参数名参数值对的设置 3 P2 {! o! I! I' Z$ |- R$ \假设我们还要再给getArea函数添加两个可缺省的参数,它们将作为结果的一部分返回, r1 p* ~5 j. Z8 l3 H& q6 V
一个叫做shape,用来表示形状,可取的值是rectangle,square和paralelogram. 其默认值是rectangle。7 ^. W) [2 m4 Y* |2 R5 X
另一个叫做unit,用来表示输入的单位,可取的值是cm,m,inches,其默认值是inches 4 Z8 f n: O7 |在上节的基础上,可以再加入两个addOptional的调用 : `5 B, K6 N* M3 I! ?% getArea版本3 , e( O. [( c: c5 P8 t
function r = getArea(width,varargin) N2 i5 n; t; r' p8 U% O* k 7 S1 b1 x, H( A2 w0 Y! G. H" ]2 d+ Z p = inputParser;% N" F8 U5 @0 e% w
p.addRequired('width',@(x)validateattributes(x,{'numeric'},... a+ w/ r' F: ^ z5 i, A {'nonzero'})); o. t5 d8 P. e: |- j& y/ ?# G a; g( z/ e, [6 i9 d1 a
8 Y) m/ Z, n. f$ P$ u defaultheight = width;* C6 l8 S" \+ t' o) n. M
p.addOptional('height',defaultheight,@(x)validateattributes(x,{'numeric'},...2 ]. i, T- \8 O1 j% D+ K
{'nonzero'})); ; Z) ]+ n% I G S5 R6 Q8 ~ 2 H9 w' Q2 r; l9 g5 {
defaultshape = 'rectangle'; - `: m. Q8 ^ e. j9 X p.addOptional('shape',defaultshape,...5 v7 u0 B+ X( c7 O. i
@(x)any(validatestring(x,{'square','rectangle','paralelogram'}))); 2 k& e8 o9 G% M% h+ r " |2 J" B4 S1 Q: x7 i$ T
defaultunit = 'inches';) t, u+ N" v4 Y( T
p.addOptional('units',defaultunit,... $ a# A: {* R( C @(x)any(validatestring(x,{'inches','cm','m'})));' A( O2 \7 I, c( ^/ s, a
8 |3 \7 I1 a3 ?: Q* T
p.parse(width,varargin{:});& G4 l$ v( o" b
; ? N. F, T! \: a; B0 K4 d: \' [# r
r.area = p.Results.width*p.Results.height; % p2 V- e! k U0 f Q2 ~4 ^
r.shape = p.Results.shape; %简单起见,shape和unit作为结构体的中的一部分返回 * L. f( S4 }; ?; D: |4 _ r.units = p.Results.units; [ Q1 Y, C m* lend- v/ T) ~' Q9 W3 u
该函数接受如下几种输入,函数的返回值是一个结构体。 8 e8 e0 N1 P3 J- ~% d1 H: J2 _% 命令行测试函数功能 + S( N5 F; ^, ]; X" i( |% T1 J1 X& T>> getArea(10,22,'square') % 只提供shape 3 S, N3 P2 I+ f- b+ rans = - l, ~ t7 B3 S! J2 Z4 ^