【问题标题】:Use varargin for multiple arguments with default values in MATLAB在 MATLAB 中对具有默认值的多个参数使用 varargin
【发布时间】:2021-03-15 00:37:34
【问题描述】:

有没有办法通过以下方式在 MATLAB 中使用 varargin 提供参数?

功能

func myFunc(varargin)
  if a not given as argument
    a = 2;
  if b not given as argument
    b = 2;
  if c not given as argument
    c = a+b;
  d = 2*c;
end

我想用 b = 3 调用上述函数一次,而前一个函数在同一个命令窗口中以 a = 3 和 c = 3 运行,这次让 b 取函数中的默认值。如何使用 varargin 来完成?

【问题讨论】:

  • 参数按顺序排列。如果您给出 2 个参数,则该函数定义了参数 1 和 2。选项是为未使用的参数传递一个空数组,检查传递了多少个参数并为 1 或 2 个参数做一些不同的事情,或者使用名称-值对。

标签: function matlab


【解决方案1】:

这是编写函数的最新最好的方法(使用 R2019b 中的 arguments blocks

function out = someFcn(options)
arguments
    options.A = 3;
    options.B = 7;
    options.C = [];
end
if isempty(options.C)
    options.C = options.A + options.B;
end
out = options.A + options.B + options.C;
end

请注意,此语法不允许您直接在 arguments 块中说出 options.C = options.A + options.B

在 MATLAB

someFcn('A', 3)

在 MATLAB >= R2021a 中,您可以使用新的 name=value 语法

someFcn(B = 7)

【讨论】:

  • 哇,我不知道这种方法——我的直觉是= 语法太可怕了;函数调用中的赋值似乎违反了现有的 MATLAB 约定! options 在这里输入现在是关键字,还是因为在 arguments 块中使用而变得重要?旧样式 'name', value 配对是否完全不适用于 options pre 21a 或者只是首选 = 语法?
  • 您可以根据自己的喜好交替使用name = value'name', value ;) options 这个名字没有什么神奇之处——你可以使用任何你喜欢的东西,只要你使用@ arguments 块中的 987654338@ 语法。 (当然,您也可以通过类型验证等来增强它)。
【解决方案2】:

自 2007a 年以来就有两种方法可以做到这一点(即很长一段时间!)。有关更新的方法,请参阅Edric's answer

  1. 使用nargin 并确保您的输入始终正确
  2. 使用名称-值对和输入解析器

nargin:稍微简单但依赖于一致的输入顺序

function myFunc( a, b, c )
    if nargin < 1 || isempty(a)
        a = 2;
    end
    if nargin < 2 || isempty(b)
        b = 2;
    end
    if nargin < 3 || isempty(c)
        c = a + b;
    end
end

使用isempty 检查,您可以选择提供稍后的参数,例如myFunc( [], 4 ) 将设置b=4,否则使用默认值。


inputParser:更灵活但不能直接处理c=a+b默认值

function myFunc( varargin )
    p = inputParser;
    p.addOptional( 'a', 2 );
    p.addOptional( 'b', 2 );
    p.addOptional( 'c', NaN ); % Can't default to a+b, default to NaN
    p.parse( varargin{:} );

    a = p.Results.a;
    b = p.Results.b;
    c = p.Results.c;
    if isnan(c) % Handle the defaulted case
        c = a + b;
    end
end

这将像myFunc( 'b', 4 ); 一样使用。由于名称-值对,这种方法也与输入顺序无关,因此您也可以执行myFunc( 'c', 3, 'a', 1 );

之类的操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2014-03-09
    • 2019-10-10
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多