5

関数を作成します

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

この関数を呼び出すときに、option 他のファイルから引数を渡すかどうかを選択できるようにしたいのですが、すべての引数を指定して関数を呼び出し、引数を渡さずに呼び出したい場合がありoptionますか?

呼び出したい :getValue(modelName, param)他のファイルから

どうすればそれができますか?

4

4 に答える 4

7

これを行う最も簡単な方法は、nargin変数を使用することです。

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実際に送信された入力引数の数です。したがって、nargin == 3オプション パラメータが設定されているか、設定されnargin < 3ていないことを示します。

したがって、いつでも次のように関数を呼び出すことができます

result = getValue('myModel', myParameter)

またはすべてのパラメータを使用

result = getValue('myModel', myParameter, someOption)
于 2012-11-22T12:54:54.360 に答える
2

を使用したソリューションnarginは既に提供されており、ほとんどの MATLAB コードベース内で多かれ少なかれ標準的な使用法になっていますが、より読みやすく、より優れた代替手段があると思います。

大きな関数でnarginは、引数 3 が正確に何であったかを覚えておく必要があります。特にオプションの引数が多い場合は、追跡したり、一部のオプションの引数が渡されたり、渡されなかったりするのを許可するのが面倒になります。

最初の簡単な解決策は、私の個人的な代替手段であり、関数narginを使用しています。exist

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

利点は、すべての入力関連のコードが最初にあり、何が起こるべきかについてより詳細になっていることです。そのロジックで他のコードを乱雑にすることはありません。また、これらのステートメントを入力の検証で補足ifし、無効なオプションが指定されたときにデフォルトに戻すこともできます。

もう 1 つの可能性は、MATLAB の以降のバージョンで標準になっているinputParserクラスです。このクラスを使用すると、オプションのパラメーターやキーと値のペアのさらに複雑なシナリオを定義できます。

以下は、毎回ドキュメントを必要としないように私が保持している自己記述的な例です。

%% 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

このアプローチはさらに冗長で、個人的には、必須かオプションかにかかわらず、入力ごとに再定義する必要があり、非常に多くの定型コードが必要になるという事実はあまり好きではありません。しかし、少なくとも、これは標準的なソリューションであり、より大きな機能に優先されることは間違いありません。

narginどちらのアプローチも、チェックの方法と比較して欠点があります。どちらも遅いです。したがって、頻繁に呼び出される (または非常に迅速な計算のみを実行する) 関数でこれらを使用する場合は、nargin代わりに使用する価値があります。

于 2012-11-22T17:54:20.377 に答える
1

完全を期すために、基本を見てみましょう (こちらのドキュメントを参照してください)。

関数で引数が使用されていない場合、それは単なる「プログラミング警告」であり、それ以上のものではありません。したがって、問題は、提供される場合と提供されない場合があるパラメーターを使用することです。

したがって、これは次を使用して処理されます

nargin                  % the number of parameters provided in current call

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

したがって、これらに基づいて、いくつかの条件をプログラムし、そこに非標準の入力パラメーターを使用するコードを含めることができます。

より複雑なケースでは、順序が定義されていない可能性がある可変長パラメーター リストを処理するvararginが最も適切です。しかし、これはこの質問には多すぎます

于 2012-11-22T13:04:46.887 に答える
0

次のリンクを見てください。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/65943

彼らはいくつかの提案を持っています

于 2012-11-22T12:56:42.117 に答える