[英]matlab function with argument not required
我創建了一個函數
function y = getValue(modelName, param, option)
open_system(modelName);
runModel(option);
y = getActiveFun(param);
end
我想在調用這個函數時可以選擇從其他文件傳遞或不傳遞參數option
,我用所有參數調用函數,有時我想調用它而不傳遞option
參數?
我想從其他文件調用: getValue(modelName, param)
我怎么能這樣做?
最簡單的方法是使用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)
雖然已經給出了帶有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
語句,並在給出無效選項時回退到默認值。
另一種可能性是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
可能更值得。
為了完整性,讓我們看一下基礎知識( 參見此處的文檔 )。
在一個函數中,如果沒有使用參數,它只是一個“編程警告”,僅此而已。 所以問題是您使用的參數可能會也可能不會提供。
所以這是使用
nargin % the number of parameters provided in current call
nargin(function_name) % the number of parameters the declaration has
因此,基於這些,您可以編寫一些條件並包含使用非標准輸入參數的代碼。
對於更復雜的情況, varargin最適合處理可能未定義排序的可變長度參數列表。 但這對於這個問題來說太過分了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.