簡體   English   中英

不需要參數的matlab函數

[英]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最適合處理可能未定義排序的可變長度參數列表。 但這對於這個問題來說太過分了

請看以下鏈接:

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

他們有幾個建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM