11.6 可变长度参数列表

有时,在定义函数时,输入参数的数量是未知的。举个例子,想象一个函数,它返回所有输入参数中的最小值。例如:

a = smallest (1, 2, 3);
b = smallest (1, 2, 3, 4);

在这个例子中,ab都将等于 1。编写smallest函数的一种方法是:

function val = smallest (arg1, arg2, arg3, arg4, arg5)
  body
endfunction

然后使用nargin的值来确定应考虑哪些输入参数。这种方法的问题在于它只能处理有限数量的输入参数。

如果特殊参数名称varargin出现在函数参数列表的末尾,则表示该函数接受可变数量的输入参数。使用varargin后,函数看起来是这样的:

function val = smallest (varargin)
  body
endfunction

在函数体中,可以通过变量varargin访问输入参数。该变量是一个包含所有输入参数的元胞数组。有关使用元胞数组的详细信息,请参阅元胞数组smallest函数现在可以这样定义:

function val = smallest (varargin)
  val = min ([varargin{:}]);
endfunction

这个实现可以处理任意数量的输入参数,但这也只是该问题一个非常简单的解决方案。

一个稍微复杂一点的varargin示例是函数print_arguments,它打印所有输入参数。这样的函数可以这样定义:

function print_arguments (varargin)
  for i = 1:length (varargin)
    printf ("Input argument %d: ", i);
    disp (varargin{i});
  endfor
endfunction

此函数产生如下输出:

print_arguments (1, "two", 3);
     -| Input argument 1:  1
     -| Input argument 2: two
     -| Input argument 3:  3
 
[reg, prop] = parseparams (params)
[reg, var1, …] = parseparams (params, name1, default1, …)

返回params中直到第一个字符串元素的元胞元素到reg中,并将从第一个字符串元素开始的所有剩余元素返回到prop中。

例如:

[reg, prop] = parseparams ({1, 2, "linewidth", 10})
reg =
{
  [1,1] = 1
  [1,2] = 2
}
prop =
{
  [1,1] = linewidth
  [1,2] = 10
}

parseparams 函数可用于将常规数值参数与以varargin元胞数组中属性/值对形式提供的附加参数分离开来。

在第二种调用形式中,可用选项直接与其默认值一起以名称-值对的形式指定。如果params不构成名称-值对,或者出现与任何可用选项都不匹配的选项,则会引发错误。

当从 m 文件函数调用时,错误消息会带有调用函数名称的前缀。

选项的匹配不区分大小写。

另请参阅: varargininputParser


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4