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 来统一处理。
类似的函数 run 用于调用用户脚本文件,这些文件不一定位于加载路径中。
script ¶("script") ¶在当前工作空间中运行脚本 script。
位于 Octave 加载路径指定的目录中,且以 .m 为扩展名的脚本,只需输入其名称即可运行。对于不在加载路径中的脚本,请使用 run。
文件名 script 可以是裸文件名、完全限定路径或相对路径,可以带文件扩展名,也可以不带。如果未指定扩展名,Octave 会先搜索带有 .m 扩展名的文件,如果找不到,再回退到无扩展名的文件名。
实现说明:如果 script 包含路径部分,则 run 会先将工作目录切换到 script 所在的目录,然后执行脚本,最后恢复到原始工作目录——除非 script 本身显式更改了目录。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2