首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不需要参数的matlab函数

不需要参数的matlab函数
EN

Stack Overflow用户
提问于 2012-11-22 12:51:33
回答 4查看 4.3K关注 0票数 5

我创建了一个函数

代码语言:javascript
复制
function y = getValue(modelName, param, option)
    open_system(modelName);
    runModel(option);
    y = getActiveFun(param);
end

我希望在调用这个函数时可以选择从其他文件传递或不传递参数option,我用所有参数调用该函数,有时我想调用它而不传递option参数?

我想从其他文件中调用:getValue(modelName, param)

我怎么能这么做?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-22 12:54:54

最简单的方法是使用nargin变量:

代码语言:javascript
复制
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表示未设置选项参数。

因此,您现在可以调用您的函数,例如

代码语言:javascript
复制
result = getValue('myModel', myParameter)

或具有所有参数

代码语言:javascript
复制
result = getValue('myModel', myParameter, someOption)
票数 7
EN

Stack Overflow用户

发布于 2012-11-22 17:54:20

虽然使用nargin的解决方案已经给出了,并且或多或少是大多数MATLAB代码库中的标准用法,但我认为还有一个更好的选择,更易于阅读。

对于大函数中的nargin,您必须记住参数3到底是什么。特别是如果您有更多的可选参数,跟踪或允许传递一些可选参数会变得非常麻烦,而其他参数则不会。

第一个也是更容易的解决方案是我个人选择的nargin,即使用exist函数:

代码语言:javascript
复制
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类。使用这个类,您可以定义更复杂的可选参数甚至键值对的场景。

下面是一个自我描述的例子,我一直保留着,以避免每次都需要文档。

代码语言:javascript
复制
%% 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
EN

Stack Overflow用户

发布于 2012-11-22 13:04:46

为了完整性,让我们看看基础(见这里的文档)。

在一个函数中,如果不使用参数,它只是一个“编程警告”,仅此而已。因此,问题在于,您使用的参数可能提供也可能不提供。

所以这是使用

代码语言:javascript
复制
nargin                  % the number of parameters provided in current call

nargin(function_name)   % the number of parameters the declaration has

因此,基于这些,您可以编写一些条件,并在其中包含使用非标准输入参数的代码。

对于更复杂的情况,瓦拉金是最合适的处理可变长度参数列表的方法,在该列表中可能没有定义排序。但这对这个问题来说太过分了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13513150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档