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通过输入验证来补充这些语句,并在给出无效选项时回退到默认值。

另一种可能性是更高版本的 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 回答