通常需要能够从另一个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