我创建了一个函数
function y = getValue(modelName, param, option)
open_system(modelName);
runModel(option);
y = getActiveFun(param);
end
我想在调用此函数时可以选择是否传递参数option
从其他一些文件我用所有参数调用函数,有时我想调用它而不传递option
参数?
我想从其他文件中调用getValue(modelName, param)
我怎么能这样做?
答案 0 :(得分: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)
答案 1 :(得分: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
语句,并在给出无效选项时回退到默认值。
另一种可能性是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
可能更值得。
答案 2 :(得分:1)
为了完整性,让我们看一下基础知识(see documentation here)。
在一个函数中,如果没有使用参数,它只是一个“编程警告”,仅此而已。所以问题是您使用的参数可能会也可能不会提供。
所以这是使用
处理的nargin % the number of parameters provided in current call
nargin(function_name) % the number of parameters the declaration has
因此,基于这些,您可以编写一些条件,并在那里包含使用非标准输入参数的代码。
对于更复杂的情况,varargin最适合处理可能未定义排序的可变长度参数列表。但这对于这个问题来说太过分了
答案 3 :(得分:0)