通过几个名称,价值和#39; MATLAB函数的参数

时间:2016-09-29 10:54:07

标签: matlab function parameters

我想知道如何通过几个可选的'名称','价值'将参数配对到MATLAB函数,如下所示:https://es.mathworks.com/help/stats/fitcknn.html

我的意思是,我的参数存储在结构中,但是这个结构并不总是包含相同数量的参数对。例如,我可以有以下结构:

options.NumNeighbors = 3
options.Standardize = 1;

因此,函数调用将是:

output = fitcknn(X,Y,'NumNeighbors',options.NumNeighbors,'Standardize',options.Standardize);

但是,另一次我可以:

options.NumNeighbors = 3
options.Standardize = 1;
options.ScoreTransform = 'logit';

因此,函数调用将具有另一个参数对:

output = fitcknn(X,Y,'NumNeighbors',options.NumNeighbors,'Standardize',...
options.Standardize,'ScoreTransform',options.ScoreTransform);

我想要的是动态调用该功能,而不必担心最终的数字对' Name' - ' Value'参数。我已经测试了类似的东西,但它不起作用:

options = {'NumNeighbors',3,'Standardize',1};
output = fitcknn(X,Y,options);

有什么想法吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使用comma-separated列表作为输入。 所以只需在选项输入中添加{:}。

options = {'NumNeighbors',3,'Standardize',1};
output = fitcknn(X, Y, options{:});

可以通过简单的for循环从结构生成选项输入。

(在下面的示例中,我使用listdlg代替fitcknn,因为我目前无法获取工具箱)

options.ListString = {'a','b'};
options.Name = 'Test';
options.ListSize = [200 300];

optInput = {};
for optField = fieldnames(options)'
    optInput{end+1} = char(optField);
    optInput{end+1} = options.(char(optField));
end
listdlg(optInput{:})

答案 1 :(得分:1)

在函数声明中使用varargin函数。它将所有额外的输入收集到一个单元数组中,您可以在函数内部进行解析。

您的函数声明将如下所示:

function [out]=myfunc(in1,in2,varargin)
% in1 and in2 are mandatory inputs

你会像这样调用你的函数:

[out]=myfunc(in1,in2,optionalIn1,optionalIn2,...,optionalInN)

然后,您将在函数工作区中获取一个单元格数组varargin,其中:

varargin{1}=optionalIn1;
varargin{2}=optionalIn2;
...
varargin{N}=optionalInN;

然后您可以解析它以满足您的需求。

答案 2 :(得分:1)

您可以通过以下方式执行此操作:

options = {'NumNeighbors',3,'Standardize',1};
output = fitcknn(X,Y,options{:});