与许多其他计算机语言不同,Octave允许您定义返回多个值的函数。定义返回多个值的函数的语法为
function [ret-list] = name (arg-list) body endfunction
这里的name, arg-list和body与以前有相同的含义,而且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; 默认情况下ntot是n.输入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
每次调用函数时,Octave也会自动初始化nargout
到期望返回的值的数目。这允许您编写行为不同的函数,具体取决于函数用户指定的值的数量。对内置变量的隐式赋值ans
的值不在输出数据的计数中,因此nargout
可以是零。
这里的svd
和hist
函数是已构建的函数的示例,这些函数的行为因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。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2