11.4多个返回值

与许多其他计算机语言不同,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; 默认情况下ntotn.输入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));

详见: 函数输入变量数, nargout, 变精蛋白, varargout, isargout.

除了设置函数输入变量数每次调用函数时,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。

详见: 函数输入变量数, varargout, isargout, nthargout.


版权所有 © 2024 Octave中文网

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