A.1.8从Oct文件调用Octave函数

通常需要能够从另一个ct文件中调用另一个Octave函数,在Octave本身中有很多这样的例子。例如quad函数是一个oct文件,它通过对用户提供的函数进行求积来计算定义积分。

还有许多方法可以将函数作为输入。它可能会被视为

  1. 函数句柄
  2. 匿名函数句柄
  3. 一串

下面的代码演示了将函数传递到另一个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