11.2定义函数

在最简单的形式中,名为的函数的定义name看起来是这样的:

作用name
  </body>结束函数

有效的函数名就像有效的变量名:字母、数字和下划线的序列,而不是以数字开头。函数与变量具有相同的名称池。

函数</body>从Octave语句组成。它是定义中最重要的部分,因为它说明了函数实际上应该是什么.

例如,这里有一个函数,当执行时,它会在您的终端上发出铃声(假设可以这样做):

函数唤醒printf(“\a”);结束函数

这个输出函数语句(详见输入和输出)简单地告诉Octave打印字符串a.特殊字符代表警报字符(ASCII 7)。详见.

一旦定义了这个函数,您就可以要求Octave通过输入函数的名称来评估它。

通常,您会希望将一些信息传递给您定义的函数。将参数传递给Octave中的函数的语法为

作用name(arg列表)  </body>结束函数

这里的arg列表是以逗号分隔的函数列表。当函数被调用时,参数名称用于保存调用中给定的参数值。参数列表可能是空的,在这种情况下,这种形式等效于上面显示的形式。

要在敲钟的同时打印消息,您可以修改唤醒看起来像这样:

函数唤醒(消息)printf(“\a%s\n”,消息);结束函数

使用这样的语句调用此函数

醒醒(“起来发光!”);

将导致Octave按终端的铃声并打印消息起来发光吧!,后跟换行符(n在的第一个参数中输出函数语句

在大多数情况下,您还希望从定义的函数中获取一些信息。以下是编写返回单个值的函数的语法:

作用ret var= name(arg列表)  </body>结束函数

符号ret var是将保存函数返回的值的变量的名称。此变量必须在函数体结束之前定义,函数才能返回值。

函数体中使用的变量是函数的局部变量。中命名的变量arg列表ret var也是函数的局部。详见全局变量,获取有关如何访问函数内部全局变量的信息。

例如,这里有一个计算向量元素平均值的函数:

函数retval=avg(v)retval=sum(v)/length(v);结束函数

如果我们写了平均值而是像这样,

函数retval=avg(v)if(isvector(v))retval=sum(v)/length(v);endifend函数

然后用矩阵而不是向量作为参数调用函数,Octave会打印这样的错误消息:

错误:赋值右侧的值未定义

因为的身体如果语句从未执行,并且retval从未定义。为了防止出现这样的模糊错误,最好始终确保返回变量始终具有值,并在遇到问题时生成有意义的错误消息。例如平均值可以这样写:

函数retval=avg(v)retval=0;如果(isvector(v))retval=sum(v)/length(v);else错误(“avg:预期向量参数”);endifend函数

这个函数还有一个问题。如果它在没有参数的情况下被叫停了呢?如果没有额外的错误检查,Octave可能会打印一条错误消息,而这条消息并不能真正帮助您追踪错误的来源。为了让您能够捕获这样的错误,Octave为每个函数提供了一个名为函数输入变量数每次调用函数时,函数输入变量数自动初始化为实际传递给函数的参数数。例如,我们可以重写平均值函数如下:

函数retval=avg(v)retval=0;if(nargin!=1)用法(“avg(vector)”);endif if(isvector(v))retval=sum(v)/length(v);else错误(“avg:预期向量参数”);endifend函数

如果用比预期更多的参数调用以.m文件代码编写的函数,Octave会自动报告错误。如果函数的参数太少,Octave不会自动报告错误,因为函数通常可能有默认参数,但任何使用未给定值的变量的尝试都会导致错误。函数可以检查调用它们时使用的参数,以避免此类问题,并提供更多特定于上下文的错误消息。

 
: n = nargin ()
: n = nargin (fcn)

返回函数的输入参数数。

从函数内部调用,返回传递给函数的参数数。在顶层,返回传递给Octave的命令行参数数。

如果使用可选参数调用fcn--函数名或句柄——返回函数可以接受的已语句参数数。

如果最后一个参数为fcn变精蛋白返回的值为负数。例如,函数协会for集语句为

函数[y,ia,ib]=并集(a,b,varargin)和nargin(“并集”)⇒ -3.

编程说明:函数输入变量数不适用于已编译的函数(十月文件),例如内置的或动态加载的函数。

详见: nargout, 纳金奇克, 变精蛋白, inputname.

 
: namestr = inputname (n)
: namestr = inputname (n, ids_only)

返回的名称n-调用函数的第th个参数。

如果参数不是简单的变量名,则返回一个空字符串。将返回的示例是数字(5.1),表达式(y2.),以及单元或结构体索引(c1.s.field).

inputname仅在函数中有用。当在命令行或脚本中使用时,它总是返回一个空字符串。

默认情况下,如果n-th参数不是有效的可变名称。如果可选参数ids_only如果为false,则返回参数的文本,即使它不是有效的变量名。这是一个Octave扩展,即使输入是复杂的表达式,程序员也可以准确地查看函数是如何被调用的。

详见: 函数输入变量数, 纳金奇克.

 
: val = silent_functions ()
: old_val = silent_functions (new_val)
: old_val = silent_functions (new_val, "local")

查询或设置内部变量,该变量控制是否抑制函数的内部输出。

如果禁用此参数,Octave将显示对函数体中未以分号结尾的表达式求值所返回的结果。

当从具有的函数内部调用时地方的参数,则该变量会为函数及其调用的任何子程序在本地进行更改。退出函数时将恢复原始变量值。


版权所有 © 2024 Octave中文网

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