を使用したソリューション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
代わりに使用する価値があります。