与许多其他计算机语言不同,Octave允许您定义返回多个值的函数。定义返回多个值的函数的语法为
作用ret列表] = name(arg列表) </body>结束函数
这里的name, arg列表和</body>与以前有相同的含义,以及ret列表是一个以逗号分隔的变量名列表,其中包含从函数返回的值。返回值的列表必须至少有一个元素。如果ret列表只有一个元素,这种形式的作用
语句与上一节中描述的形式等效。
这里是一个函数的例子,它返回两个值,即向量的最大值和向量中第一次出现的索引。
函数[max,idx]=vmax(v)idx=1;max=v(idx);对于i=2:长度(v)如果(v(i)>max)max=v(i;idx=i;endif endforend函数
在这种特殊情况下,这两个值本可以作为单个数组的元素返回,但这并不总是可能的,也不方便。要返回的值可能没有兼容的维度,通常需要为各个返回值提供不同的名称。
可以使用nthargout
函数,在一个元胞数组中一次只获取某些返回值或几个返回值。详见元胞数组对象.
arg =
nthargout (n, fcn, …)
¶arg =
nthargout (n, ntot, fcn, …)
¶返回n函数句柄或字符串指定的函数的第th个输出参数fcn.
任何其他参数都会直接传递给fcn。要调用的参数总数fcn可以传入ntot; 默认情况下ntot是n.输入n也可以是输出的片段向量,在这种情况下,输出将是所指定的输出自变量的元胞数组。
的预期用途nthargout
是为了避免中间变量。例如,当找到矩阵的最大入口的索引时,以下两个组成nthargout
m=魔术(5);cell2mat(nthargout([1,2],@ind2sub,大小(m),nthargout(2,@最大,m(:))))⇒ 5 3
完全等效于以下行:
m=魔术(5);[~,idx]=最大值(M(:));[i,j]=ind2sub(大小(m),idx);[i,j]⇒ 5 3
如以下代码所示,将所有输出参数收集到单个元胞数组中也很有帮助:
USV=nthargout([1:3],@svd,hilb(5));
除了设置函数输入变量数
每次调用函数时,Octave也会自动初始化nargout
到期望返回的值的数目。这允许您编写行为不同的函数,具体取决于函数用户指定的值的数量。对内置变量的隐式赋值ans
的值不在输出胶的计数中,因此nargout
可以是零。
这个svd
和历史
函数是已构建的函数的示例,这些函数的行为因的值而异nargout
例如历史
当在没有输出变量的情况下调用时,它将绘制直方图,但如果在有输出的情况下进行调用,它将返回频率计数和/或仓中心,而不创建绘图。
可以编写只设置某些返回值的函数。例如,调用函数
函数[x,y,z]=f()x=1;z=2;结束函数
像
[a,b,c]=f()
生产:
a=1b=[](0x0)c=2
同时报警告。
n =
nargout ()
¶n =
nargout (fcn)
¶返回函数的输出参数数。
从函数中调用,返回被调用者期望接收的值的数目。在顶层,nargout
如果没有参数,则会被取消定义,并将返回错误。
如果使用可选参数调用fcn--函数名或句柄——返回函数可以返回的语句输出值的数目。
如果最终输出参数为varargout返回的值为负数。
例如
f
将导致nargout
在函数内部返回0f
和
[s,t]=f()
将导致nargout
在函数内部返回2f
.
在第二种使用中,
nargout(@histc)#或使用字符串输入的nargot(“histc”)
将返回2,因为histc
有两个输出,而
nar痛风(@imread)
将返回-2,因为imread
有两个输出,第二个是varargout.
编程说明。nargout
不适用于内置函数,而对于所有匿名函数则为-1。
版权所有 © 2024 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号