9.1 按名称调用函数

feval 函数允许你通过包含函数名的字符串来调用该函数。这在编写需要调用用户提供的函数的代码时非常有用。feval 的第一个参数是要调用的函数名称,后续参数都会传递给该函数。

以下是一个使用 feval 的示例函数,它用牛顿法求解用户提供的一元函数的根。这个示例仅为演示目的而设计。

function result = newtroot (fname, x)

# usage: newtroot (fname, x)
#
#   fname : a string naming a function f(x).
#   x     : initial guess

  delta = tol = sqrt (eps);
  maxit = 200;
  fx = feval (fname, x);
  for i = 1:maxit
    if (abs (fx) < tol)
      result = x;
      return;
    else
      fx_new = feval (fname, x + delta);
      deriv = (fx_new - fx) / delta;
      x = x - fx / deriv;
      fx = fx_new;
    endif
  endfor

  result = x;

endfunction

请注意,这个函数仅作为调用用户提供的函数的示例,不应过于较真。在实际的严谨代码中,除了使用更稳健的算法外,还应该检查所有参数的数量和类型,确保提供的函数确实是函数等。有关数值对象的判断函数列表,请参见数值对象的判断函数;有关 exist 函数的描述,请参见变量的状态

 
[y1, y2, …] = feval ('fcn', x1, x2, …)
[y1, y2, …] = feval (@fcn, x1, x2, …)

使用输入参数 x1, x2, ... 执行函数 fcn

函数 fcn 可以用字符串指定函数名,也可以作为函数句柄传入。第一个参数之后的所有参数都将作为输入传递给指定函数。例如:

feval ("acos", -1)
     ⇒   3.1416

上面这行代码用参数 -1 调用了 acos 函数。

feval 函数也可以与任意类型的函数句柄一起使用(参见函数句柄)。历史上,feval 是调用字符串中用户提供的函数的唯一方式,但由于函数句柄提供了更简洁的语法,现在更推荐使用函数句柄。例如:

f = @exp;
feval (f, 1)
    ⇒   2.7183
f (1)
    ⇒   2.7183

以上两种方式等效,都是调用 f 所引用的函数。如果事先无法预知 f 是函数句柄、字符串形式的函数名还是内联函数,则可以使用 feval 来统一处理。

另请参阅: builtin, eval, evalin

类似的函数 run 用于调用用户脚本文件,这些文件不一定位于加载路径中。

 
run script
run ("script")

在当前工作空间中运行脚本 script

位于 Octave 加载路径指定的目录中,且以 .m 为扩展名的脚本,只需输入其名称即可运行。对于不在加载路径中的脚本,请使用 run

文件名 script 可以是裸文件名、完全限定路径或相对路径,可以带文件扩展名,也可以不带。如果未指定扩展名,Octave 会先搜索带有 .m 扩展名的文件,如果找不到,再回退到无扩展名的文件名。

实现说明:如果 script 包含路径部分,则 run 会先将工作目录切换到 script 所在的目录,然后执行脚本,最后恢复到原始工作目录——除非 script 本身显式更改了目录。

另请参阅: path, addpath, source


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

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