【问题标题】:Optional args in MATLAB functionsMATLAB 函数中的可选参数
【发布时间】:2011-10-09 11:52:04
【问题描述】:

如何在 MATLAB 中使用可选参数声明函数?

例如:function [a] = train(x, y, opt),其中 opt 必须是可选参数。

【问题讨论】:

标签: function math matlab parameters arguments


【解决方案1】:

关于如何执行此操作有几个不同的选项。最基本的是使用varargin,然后使用nargin、size等判断可选参数是否已经传递给函数。

% Function that takes two arguments, X & Y, followed by a variable 
% number of additional arguments
function varlist(X,Y,varargin)
   fprintf('Total number of inputs = %d\n',nargin);

   nVarargs = length(varargin);
   fprintf('Inputs in varargin(%d):\n',nVarargs)
   for k = 1:nVarargs
      fprintf('   %d\n', varargin{k})
   end

一个看起来更优雅的解决方案是使用inputParser 类来定义你的函数所期望的所有参数,包括必需的和可选的。 inputParser 还允许您对所有参数执行类型检查。

【讨论】:

    【解决方案2】:

    一个简单的方法是通过nargin(N 个参数)。缺点是您必须确保您的参数列表和 nargin 检查匹配。

    值得记住的是,所有输入都是可选的,但是如果调用未设置的变量,函数将退出并出错。以下示例为 b 和 c 设置默认值。如果a 不存在,将退出。

    function [ output_args ] = input_example( a, b, c )
    if nargin < 1
      error('input_example :  a is a required input')
    end
    
    if nargin < 2
      b = 20
    end
    
    if nargin < 3
      c = 30
    end
    end
    

    【讨论】:

      【解决方案3】:

      解决这个问题的一个好方法是不要使用nargin,而是使用exist('opt', 'var')检查变量是否已设置。

      例子:

      function [a] = train(x, y, opt)
          if (~exist('opt', 'var'))
              opt = true;
          end
      end
      

      有关这样做的优点,请参阅此答案:How to check whether an argument is supplied in function call?

      【讨论】:

        【解决方案4】:

        Mathworks:Function Argument Validation

        有详细的说明如何在函数中使用可选参数。此外,您还可以学习如何使用内置 matlab fun like 之类的函数

        fun(arg1,'key1',value1)

        上面有一些使用技巧的例子:

        function [a] = train(x,y,opt)
            arguments
                x double
                y double
                opt {mustBeNonempty} = true
                % this set the default value for opt is true
            end
            
            if opt
                a = 1;
            else
                a = x+y;
            end
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-26
          • 1970-01-01
          • 1970-01-01
          • 2018-06-27
          • 2013-06-10
          相关资源
          最近更新 更多