11.4多个返回值

与许多其他计算机语言不同,Octave允许您定义返回多个值的函数。定义返回多个值的函数的语法为

function [ret-list] = name (arg-list)
  body
endfunction

这里的name, arg-listbody与以前有相同的含义,而且ret-list是一个以逗号分隔的变量名列表,其中包含从函数返回的值。返回值的列表必须至少有一个元素。如果ret-list只有一个元素,这种形式的function语句与上一节中描述的形式等效。

这里是一个函数的例子,它返回两个值,即向量的最大值和向量中第一次出现的索引。

function [max, idx] = vmax (v)
  idx = 1;
  max = v (idx);
  for i = 2:length (v)
    if (v (i) > max)
      max = v (i);
      idx = i;
    endif
  endfor
endfunction

在这种特殊情况下,这两个值本可以作为单个数组的元素返回,但这并不总是可能的,也不方便。要返回的值可能没有兼容的维度,通常需要为各个返回值提供不同的名称。

可以使用nthargout函数,在一个元胞数组中一次只获取某些返回值或几个返回值。详见元胞数组对象.

 
: arg = nthargout (n, fcn, …)
: arg = nthargout (n, ntot, fcn, …)

返回函数句柄或字符串fcn指定的函数的第n个输出参数.

任何其他参数都会直接传递给fcn。可以传入fcn要调用的参数总数ntot; 默认情况下ntotn.输入n也可以是输出的片段向量,在这种情况下,输出将是所指定的返回变量的元胞数组。

nthargout的预期用途是为了避免中间变量。例如,当找到矩阵的最大入口的索引时,nthargout由以下两个返回值组成:

m = magic (5);
cell2mat (nthargout ([1, 2], @ind2sub, size (m),
                     nthargout (2, @max, m(:))))
⇒ 5   3

完全等效于以下行:

m = magic (5);
[~, idx] = max (M(:));
[i, j] = ind2sub (size (m), idx);
[i, j]
⇒ 5   3

如以下代码所示,将所有输出参数收集到单个元胞数组中也很有帮助:

USV = nthargout ([1:3], @svd, hilb (5));

编程注意:等效的nthargout函数的功能可以通过忽略输出简单地实现,这在代码中经常使用字符~。这种功能是由Octave解释器实现的,甚至比使用这个函数更有效。

等效的代码如下:

idx = nthargout (2, @max, rand (100, 1));
≡
[~, idx] = max (rand (100, 1));

详见: nargin, nargout, varargin, varargout, isargout.

广告

除了设置nargin每次调用函数时,Octave也会自动初始化nargout到期望返回的值的数目。这允许您编写行为不同的函数,具体取决于函数用户指定的值的数量。对内置变量的隐式赋值ans的值不在输出数据的计数中,因此nargout可以是零。

这里的svdhist函数是已构建的函数的示例,这些函数的行为因nargout的值而异,例如hist当在没有返回变量的情况下调用时,它将绘制直方图,但如果在有输出的情况下进行调用,它将返回频率计数和/或规格中心,而不创建绘图。

可以编写只设置某些返回值的函数。例如,调用函数

function [x, y, z] = f ()
  x = 1;
  z = 2;
endfunction

[a, b, c] = f ()

生产:

a = 1

b = [](0x0)

c = 2

同时报警告。

 
: n = nargout ()
: n = nargout (fcn)

返回函数的输出参数数。

如果从函数内部调用,返回被调用者期望接收的值的数目。如果从函数外部调用,且如果nargout没有参数,则会被取消定义,并将返回错误。

如果使用可选参数调用fcn--函数名或句柄——返回函数可以返回的语句输出值的数目。

如果最终输出参数为varargout返回的值为负数。

例如

f ()

将导致nargout在函数f内部返回0,且

[s, t] = f ()

将导致nargout在函数f内部返回2.

在第二种使用中,

nargout (@histc)   # or nargout ("histc") using a string input

将返回2,因为histc有两个输出,而

nargout (@imread)

将返回-2,因为imread有两个输出,第二个是varargout.

编程说明。nargout不适用于内置函数,而对于所有匿名函数则返回-1。

详见: nargin, varargout, isargout, nthargout.

广告

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

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