2012-11-22 15 views
5

ich eine FunktionMatlab-Funktion mit dem Argument nicht erforderlich

function y = getValue(modelName, param, option) 
    open_system(modelName); 
    runModel(option); 
    y = getActiveFun(param); 
end 

erstellen Ich mag würde, wenn diese Funktion aufgerufen, die Wahl haben zu passieren oder nicht Argument option von einigen anderen Dateien, die ich die Funktion mit allen Argumenten aufrufen und manchmal möchte ich es nennen, ohne option Argument zu übergeben?

würde ich nennen möchte: getValue(modelName, param) aus anderen Dateien

Wie ich das tun könnte?

+0

Was würden Sie von 'runModel' erwarten, wenn Sie den' option' Parameter nicht übergeben? –

+0

Ich möchte aufrufen: getValue (modelName, param) aus anderen Dateien – lola

Antwort

7

Der einfachste Weg, dies zu tun ist, um die nargin Variable zu verwenden:

function y = getValue(modelName,param,option) 
    open_system(modelName); 

    if (nargin < 3) 
     # No option passed, do something like 
     runModel('defaultOption') 
    else 
     # Option passed 
     runModel(option); 
    end 
    y = getActiveFun(param); 
end 

nargin ist nur die Anzahl der Eingabeargumente, die tatsächlich abgegeben wurden. Daher gibt nargin == 3 an, dass der Optionsparameter nargin < 3 so eingestellt wurde, dass er nicht festgelegt wurde.

So könnten Sie jetzt rufen immer Ihre Funktion wie

result = getValue('myModel', myParameter) 

oder mit allen Parametern

result = getValue('myModel', myParameter, someOption) 
+0

Ich möchte aufrufen: getValue (ModelName, param) aus anderen Dateien (ohne Übergabe Option an die Funktion getValue – lola

+1

Und das ist genau das, was der Code oben ermöglicht Wenn Sie die Option nicht übergeben, müssen Sie entscheiden, wie 'runModel' dann aufgerufen wird. Ich habe eine Dummy-Standardoption hinzugefügt, aber Sie können damit umgehen, wie Sie möchten. – Thilo

1

Der Vollständigkeit halber können die Grundlagen sehen (see documentation here).

In einer Funktion, wenn ein Argument nicht verwendet wird, ist es nur eine „Programmier Warnung“, nichts weiter. Das Problem besteht also darin, dass Sie einen Parameter verwenden, der möglicherweise nicht angegeben wird.

So wird diese

nargin     % the number of parameters provided in current call 

nargin(function_name) % the number of parameters the declaration has 

So auf dieser Grundlage mit behandelt einige Bedingungen programmieren kann, und umfasst dort den Code, der die Nicht-Standard-Eingabeparameter verwendet.

Für komplexere Fälle varargin ist sehr richtig, dass variable Länge Parameterliste behandelt, wo die Reihenfolge nicht definiert werden kann. Aber das ist zu viel für diese Frage

2

Während Lösungen mit nargin sind bereits gegeben und mehr oder weniger eine Standard-Verwendung innerhalb der meisten MATLAB Codebasen, denke ich, es gibt eine bessere Alternative, die besser lesbar ist.

Mit nargin in großen Funktionen, müssen Sie daran denken, was Argument 3 genau war. Vor allem, wenn Sie mehrere optionale Argumente haben, wird es mühsam, den Überblick zu behalten oder zu erlauben, dass einige optionale Argumente übergeben werden, während andere dies nicht tun.

Die erste und einfachere Lösung ist meine persönliche Alternative zu nargin, und das ist mit der exist Funktion:

function [output] = getValue(modelName,param,option, otherOption) 

if ~exist('option', 'var') || isempty(option) 
    option = 'defaultValueForOption'; 
end 

if ~exist('otherOption', 'var') || isempty(otherOption) 
    otherOption = 'defaultValueForOption'; 
end 

% perform other actions 

Der Vorteil ist, dass jetzt alle Eingangsbezogenen Code am Anfang und es ist ausführlicher was passieren soll. Sie werden Ihren anderen Code mit dieser Logik nicht überladen. Und Sie können diese if-Anweisungen auch mit einer Validierung der Eingabe ergänzen und auf den Standardwert zurückgreifen, wenn eine ungültige Option angegeben wird.

Die andere Möglichkeit ist Standard in späteren Versionen von MATLAB: die inputParser Klasse. Mit dieser Klasse können Sie noch kompliziertere Szenarien für optionale Parameter und sogar Schlüssel/Wert-Paare definieren.

Unten ist ein selbstbeschreibendes Beispiel, das ich aufbewahrt habe, um zu vermeiden, dass jedes Mal die Dokumentation benötigt wird.

%% Usage Example input Parser 
% 
function output = FuncName(rParam1, rParam2, oParam1, oParam2, varargin) 

p = inputParser(); 

defaultValue = 0; 
validatorFunc = @(x)(true); % validator function should return true when x is valid 

%% Input Format definition 

p.addRequired('rParam1', validatorFunc); 
p.addRequired('rParam2', validatorFunc); 

p.addOptional('oParam1', defaultValue, validatorFunc); 
p.addOptional('oParam2', defaultValue, validatorFunc); 

p.addParamValue('kvParam1', defaultValue, validatorFunc); 
p.addParamValue('kvParam2', defaultValue, validatorFunc); 
p.addParamValue('kvParam3', defaultValue, validatorFunc); 
p.addParamValue('kvParam4', defaultValue, validatorFunc) 

%% Optional Settings 
% expand supplied struct to ParamValue pairs (or other arguments) 
p.StructExpand = true; % default: false 

%% Parse 
p.parse(rParam1, rParam2, oParam1, oParam2, varargin{:}) 

%% Retrieve results 
values = p.Results(); % structure with all values 
defaultedArgs = p.UsingDefaults; % cell array of all parameter names using defaults 
end 

Dieser Ansatz ist noch ausführlicher und persönlich, ich weiß nicht recht, wie die Tatsache, dass man für jeden Eingang neu zu definieren hat, ob es erforderlich ist, oder optional und es erfordert ziemlich viel Standardcode. Aber zumindest ist es eine Lösung, die eine Standardlösung ist und ohne Zweifel für größere Funktionen vorzuziehen ist.

Beide Ansätze leiden unter einem Nachteil im Vergleich zu der nargin Art der Überprüfung: Sie sind beide langsamer. Wenn Sie diese also in Funktionen verwenden, die häufig aufgerufen werden (oder nur eine sehr schnelle Berechnung durchführen), ist es möglicherweise sinnvoller, stattdessen nargin zu verwenden.

+0

Dieser Beispielcode funktioniert nicht: ' p.expandStruct = true; 'sollte' p.StructExpand = true sein; '. Quelle: [inputParser docs] (http://www.mathworks.com/help/matlab/ref/inputparser-class.html) –

+0

@BrandonJackson : Danke, dass du mich informiert hast, ich habe mein Beispiel angepasst. – Egon

Verwandte Themen