2016-09-29 6 views
1

私は、私はこのようなMATLAB関数に、「値」のペアのパラメータをいくつかのオプションの「名前」を渡すことができますどのように把握しようとしています:https://es.mathworks.com/help/stats/fitcknn.htmlパスいくつかの「名前、値」パラメータMATLAB関数へ

私が意味します私のパラメータは構造体に格納されますが、この構造体には常に同じ数のパラメータが含まれているとは限りません。例えば、私は以下の構造体を持つことができます。

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'のペアの最終数を気にせずに、関数を動的に呼び出すことです。私はこのようなテストをしましたが、うまくいきません。

アイデアはありますか?事前

答えて

2

あなたが入力としてcomma-separatedリストを使用することができます。 オプション入力に{:}を追加するだけです。

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

オプション入力は、単純なforループによって構造体から生成できます。

(私は現在、ツールボックスを得ることができなかったとの例では、私が代わりにfitcknnlistdlgを使用しています下の)

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{:}) 
+0

これは機能します!ありがとうございました! –

0

おかげで、あなたの関数宣言で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; 

これは、必要に応じて解析できます。

+0

この答えは質問に答えていません。 – malcomwu

+0

ええ、私は質問を誤解していました。質問者に '{:} 'について知っていると仮定しました。 – adjpayot

1

あなたは次のようにそれを行うことができます。

options = {'NumNeighbors',3,'Standardize',1}; 
output = fitcknn(X,Y,options{:}); 
関連する問題