Matlab编程设置默认参数——internal.stats.parseArgs

指南

当我们编写算法时,经常会遇到可调节的参数很多的情况。对于使用者来说,过多的调节参数可不是什么方便的事情。因此算法设计者最好先设置默认的参数值,使用者可以根据情况来调节这些参数。这样的代码鲁棒性更好。
一般的思路是:

设置默认参数值 :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]的逻辑向量。

猜你喜欢

转载自blog.csdn.net/qq_19531479/article/details/79468458