通常需要能够从另一个ct文件中调用另一个Octave函数,在Octave本身中有很多这样的例子。例如quad函数是一个oct文件,它通过对用户提供的函数进行求积来计算定义积分。
还有许多方法可以将函数作为输入。它可能会被视为
下面的代码演示了将函数传递到另一个ct文件的所有四种方法。
#include <octave/oct.h>
#include <octave/parse.h>
DEFMETHOD_DLD (funcdemo, interp, args, nargout, "Function Demo")
{
int nargin = args.length ();
if (nargin < 2)
print_usage ();
octave_value_list newargs;
for (octave_idx_type i = nargin - 1; i > 0; i--)
newargs(i-1) = args(i);
octave_value_list retval;
if (args(0).is_function_handle () || args(0).is_inline_function ()
|| args(0).is_string ())
retval = interp.feval (args(0), newargs, nargout);
else
error ("funcdemo: INPUT must be string, inline, or function handle");
return retval;
}
演示代码的第一个输入是用户提供的函数,其余参数都传递给该函数。
funcdemo (@sin, 1)
⇒ 0.84147
funcdemo (@(x) sin (x), 1)
⇒ 0.84147
funcdemo ("sin", 1)
⇒ 0.84147
funcdemo (@atan2, 1, 1)
⇒ 0.78540
当用户函数作为字符串传递时,函数的处理方式是不同的。在某些情况下,有必要使用用户提供的函数asanoctave_function对象在这种情况下,字符串参数可以用于创建一个临时函数,如下所示。
std::octave fcn_name = unique_symbol_name ("__fcn__");
std::string fcode = "function y = ";
fcode.append (fcn_name);
fcode.append ("(x) y = ");
fcn = extract_function (args(0), "funcdemo", fcn_name,
fcode, "; endfunction");
...
if (fcn_name.length ())
clear_function (fcn_name);
在这种情况下,有两件重要的事情需要了解。首先,用户函数的输入参数的数量是固定的,在上面的例子中是一个单独的参数。其次,为了避免将临时函数留在Octavesymbol表中,应在使用后将其清除。此外,按照惯例,所有内部函数名称都以字符序列“”开头和结尾__’.
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2