【问题标题】:matlab function with argument not required不需要参数的matlab函数
【发布时间】:2012-11-10 21:04:33
【问题描述】:

我创建一个函数

function y = getValue(modelName, param, option)
    open_system(modelName);
    runModel(option);
    y = getActiveFun(param);
end

我希望在调用此函数时可以选择是否传递参数option 从其他一些文件中,我使用所有参数调用该函数,有时我想在不传递 option 参数的情况下调用它?

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

我该怎么做?

【问题讨论】:

  • 如果您不传递option 参数,您希望runModel 做什么?
  • 我想从其他文件调用:getValue(modelName,param)

标签: matlab


【解决方案1】:

最简单的方法是使用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 &lt; 3 表示尚未设置。

因此,您现在可以随时调用您的函数

result = getValue('myModel', myParameter)

或所有参数

result = getValue('myModel', myParameter, someOption)

【讨论】:

  • 我想从其他文件调用:getValue(modelName,param)(不将选项传递给getValue函数
  • 这正是上面的代码允许你做的。如果您不通过选项,您将不得不决定如何调用“runModel”。我添加了一个虚拟默认选项,但您可以随意处理。
【解决方案2】:

看下面的链接:

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

他们有几个建议

【讨论】:

    【解决方案3】:

    为了完整起见,让我们看看基础知识 (see documentation here)。

    在函数中如果没有使用参数,它只是一个“编程警告”,仅此而已。所以问题是你使用了一个可能提供也可能不提供的参数。

    所以这是使用

    处理的
    nargin                  % the number of parameters provided in current call
    
    nargin(function_name)   % the number of parameters the declaration has
    

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

    对于更复杂的情况,varargin 最适合处理可能未定义排序的可变长度参数列表。但这对于这个问题来说太过分了

    【讨论】:

      【解决方案4】:

      虽然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 可能更值得。

      【讨论】:

      • 此示例代码不起作用:p.expandStruct = true; 应为 p.StructExpand = true;。来源:inputParser docs
      • @BrandonJackson:感谢您告诉我,我已经修改了我的示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多