matlab中的parse_input究竟是做什么的?

时间:2015-04-24 23:10:41

标签: matlab

我正在阅读matlab的bioinformatics工具箱中的集群功能。请参阅cluster.m

现在我被以下代码的第五行所困扰。

function [clus, nclus, steps]=cluster(tr,v,varargin)
numBranches=size(tr.tree,1);
numLeaves=numBranches+1;
numLabels=numBranches+numLeaves;
[criteria, P, n]=parse_inputs(tr, numLeaves, varargin{:});

这是我的错误

  

我知道varargin {:}是函数的可变参数个数。

但到底发生了什么? 非常感谢您的时间和关注。

1 个答案:

答案 0 :(得分:0)

它是一个本地功能。向下滚动以查看它。

每当您看到一个不熟悉的函数时,请键入which,然后键入函数名称以检查它是否为Matlab函数;如果是,请输入help以获取有关如何使用它的更多信息,如果它不是,那么您的提示就是在代码中查找它。

此外,Matlab的内置功能在他们的命名(AFAIK)中不使用下划线,因此,您可以看到的功能不是很重要。来自Mathworks。

来自链接文件:

function [criteria,P,n] = parse_inputs(tr,numLeaves,varargin)
% Parse the varargin parameter/value inputs

% Check that we have the right number of PVP inputs
if rem(numel(varargin),2)~= 0
    error('Bioinfo:phytree:cluster:IncorrectNumberOfArguments',...
        'Incorrect number of arguments to %s.',mfilename);
end

% The allowed inputs
okargs = {'criterion','distances','maxclust'};

% Set default values
P = squareform(pdist(tr)); % Pairwise distances, stored in square form 
                           % since it will be indexed by row and columns
n = inf; % default maximum number of clusters
criteria = 'm'; % maximum is default criteria

for j=1:2:numel(varargin)-1
    [k, pval] = bioinfoprivate.pvpair(varargin{j}, varargin{j+1}, okargs, ['phytree:' mfilename]);
    switch(k)
        case 1 % 'criterion'
            crits = {'maximum','average','median','silhouette','gain','ratio'};
            crit = strmatch(lower(pval),crits);
            if isempty(crit)
                error('Bioinfo:phytree:cluster:NotValidCriterion',...
                    'Not a valid criterion.')
            elseif numel(crit)>1
                error('Bioinfo:phytree:cluster:AmbiguousCriterion',...
                    'Ambiguous criterion.')
            else
                codes = 'madsgr';
                criteria = codes(crit);
            end
        case 2 % 'distances'
            if isnumeric(pval) && isequal(size(pval),[numLeaves,numLeaves]) && all(~diag(pval)) && isequal(pval,pval') 
                P = pval;
            elseif isnumeric(pval) && isvector(pval) && numel(pval)==(numLeaves*(numLeaves-1)/2)
                P = squareform(pval);
            else
                error('Bioinfo:phytree:cluster:InvalidDistances',...
                       'DISTANCES must be compatible to the output of SEQPDIST, PDIST, or PHYTREE/PDIST.') 
            end
        case 3 % 'maxclust'
            if ~isnumeric(pval) || ~isscalar(pval) || rem(pval,1) || pval<1
                 error('Bioinfo:phytree:cluster:InvalidMaxClust',...
                       'MAXCLUST must be a positive integer.')
            end
            n = pval;
    end
end