我想知道如何通过几个可选的'名称','价值'将参数配对到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);
有什么想法吗?
提前致谢
答案 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{:});