通常需要能够从另一个ct文件中调用另一个Octave函数,在Octave本身中有很多这样的例子。例如quad
函数是一个oct文件,它通过对用户提供的函数进行求积来计算定义积分。
还有许多方法可以将函数作为输入。它可能会被视为
下面的代码演示了将函数传递到另一个ct文件的所有四种方法。
#include<octave/oct.h>#include<octave/sparse.h>DEFMETHOD_DLD(funcdemo,interp,args,nar痛风,“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);octove_value-list retval;if(args(0).is_Function_handle()|args(0.is_inline_Function()||args(0).is_string())retval=interp.eval(args(1),newargs,nargout);else error(“funcdemo:INPUT必须是字符串、内联或函数句柄”);return retval;}
演示代码的第一个输入是用户提供的函数,其余参数都传递给该函数。
funcdemo(@sin,1)⇒ 0.84147funcdemo(@(x)sin(x),1)⇒ 0.84147函数演示(“sin”,1)⇒ 0.84147函数演示(@atan2,1,1)⇒ 0.78540
当用户函数作为字符串传递时,函数的处理方式是不同的。在某些情况下,有必要使用用户提供的函数asanOctave函数
对象在这种情况下,字符串参数可以用于创建一个临时函数,如下所示。
std::Octavefcn_name=unique_symbol_name(“__fcn__”);std::string fcode=“函数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 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号