指南
当我们编写算法时,经常会遇到可调节的参数很多的情况。对于使用者来说,过多的调节参数可不是什么方便的事情。因此算法设计者最好先设置默认的参数值,使用者可以根据情况来调节这些参数。这样的代码鲁棒性更好。
一般的思路是:
设置默认参数值 :internal.stats.parseArgs
检查输入: internal.stats.getParamVal或 strncmpi
internal.stats.parseArgs
举个例子,调用k均值聚类算法kmeans时,matlab中有以下几行代码:
pnames = { 'distance' 'start' 'replicates' 'emptyaction' 'onlinephase' 'options' 'maxiter' 'display'};
dflts = {'sqeuclidean' 'sample' [] 'singleton' 'on' [] [] []};
[distance,start,reps,emptyact,online,options,maxit,display] ...
= internal.stats.parseArgs(pnames, dflts, varargin{:});
输入参数:
pnames就是所有可输入的参数的名称,如’distance’
dflts就是这些参数的默认值,参数名称和默认值是一一对应的,因而没有默认值时要设置为[].例如,‘distance’的默认值为’sqeuclidean’
- varargin{:} 就是输入,内容为想要的参数,输入的格式为:‘参数名称’,参数值。matlab允许较模糊的输入,例如’distance’,输入时写成’dist’,’Distance’都是合法的。
输出参数:
函数参数的值,当调用函数时没有设置此项参数,则此项参数的输出值为默认值,否则为设置的值,例如
pnames = {'color' 'linestyle', 'linewidth'}
dflts = { 'r' '_' '1'}
varargin = {'linew' 2 'linestyle' ':'}
[c,ls,lw] = internal.stats.parseArgs(pnames,dflts,varargin{:})
% On return, c='r', ls=':', lw=2
internal.stats.getParamVal
检查输入的参数值是否合法。比如一些参数,有有限的几个选择。getParamVal比较参数值是否包含在合法的集合内,如果不是就会报错
举个例子,还是kmeans中的代码
distNames = {'sqeuclidean','cityblock','cosine','correlation','hamming'};
distance = internal.stats.getParamVal(distance,distNames,'''Distance''');
输入参数:
- dsitance是参数’distance’对应输入的参数值
- distNames是合法的参数值集合。
- 第三个参数是这个参数的名称
strncmpi
比较字符串数组的前n个字符是否相等。这个函数也可以用来检查输入的参数值是否合法,前提是输入的参数值是字符串。
还是以kmeans中的代码为例
startNames = {'uniform','sample','cluster'};
j = find(strncmpi(start,startNames,length(start)));
if length(j) > 1
error(message('stats:kmeans:AmbiguousStart', start));
elseif isempty(j)
error(message('stats:kmeans:UnknownStart', start));
elseif isempty(k)
error(message('stats:kmeans:MissingK'));
end
start = startNames{j};
输入参数:
- startNames——合法的参数值集合
- start——参数的值
- 第三个参数,需要比较的字符串的前n个值是否相等,例如上面的例子中比较start值和startName的字符串数组中所有字符串前5个字符,即length(start)是否相等。
输出参数
返回值为长度为length(startNames)的逻辑向量,相等的位置为1否则为0.如上面的例子,如果start的值是sample,则返回为[0,1,0]的逻辑向量。