主要内容gydF4y2Ba

coder.cevalgydF4y2Ba

调用外部C/ c++函数gydF4y2Ba

描述gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_namegydF4y2Ba)gydF4y2Ba执行指定的C/ c++外部函数gydF4y2Bacfun_namegydF4y2Ba。定义gydF4y2Bacfun_namegydF4y2Ba在外部C/ c++源文件或库中。向代码生成器提供外部源代码、库和头文件。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba。gydF4y2Bacfun_argumentsgydF4y2Ba用逗号分隔的输入参数列表的顺序是gydF4y2Bacfun_namegydF4y2Ba需要。gydF4y2Ba

默认情况下,gydF4y2Bacoder.cevalgydF4y2Ba如果C/ c++支持按值传递参数,则按值传递参数给C/ c++函数。万博1manbetx为了使gydF4y2Bacoder.cevalgydF4y2Ba通过引用传递参数,使用结构gydF4y2Bacoder.refgydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba,gydF4y2Bacoder.wrefgydF4y2Ba。如果C/ c++不支持按值传递参数,万博1manbetx例如,如果参数是一个数组,gydF4y2Bacoder.cevalgydF4y2Ba通过引用传递参数。如果你不使用gydF4y2Bacoder.refgydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba或gydF4y2Bacoder.wrefgydF4y2Ba,参数的副本可以出现在生成的代码中以执行MATLABgydF4y2Ba®gydF4y2Ba语义数组。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba和显示gydF4y2Bacfun_namegydF4y2Ba使用一个或多个MATLAB全局变量。然后,代码生成器可以生成与此全局变量使用一致的代码。gydF4y2Ba

coder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba和显示gydF4y2Bacfun_namegydF4y2Ba使用一个或多个MATLAB全局变量。gydF4y2Ba

coder.ceval (gydF4y2Ba“-gpudevicefcn”gydF4y2Ba、devicefun_name devicefun_arguments)gydF4y2Ba允许你调用CUDAgydF4y2Ba®gydF4y2BaGPUgydF4y2Ba__device__gydF4y2Ba函数来自内核。gydF4y2Ba“-gpudevicefcn”gydF4y2Ba指示gydF4y2Bacoder.cevalgydF4y2Ba目标功能在GPU设备上。gydF4y2Badevicefun_namegydF4y2Ba您的姓名是gydF4y2Ba__device__gydF4y2Ba功能和gydF4y2Badevicefun_argumentsgydF4y2Ba用逗号分隔的输入参数列表的顺序是gydF4y2Badevicefun_namegydF4y2Ba需要。该选项需要GPU编码器™产品。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Ba“布局:rowMajor”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并传递存储在行主布局中的数据。当从使用列主布局的函数调用时,代码生成器将输入转换为行主布局,并将输出转换回列主布局。对于更短的语法,请使用gydF4y2Bacoder.ceval(‘行’,…)gydF4y2Ba。gydF4y2Ba

coder.ceval (gydF4y2Ba“布局:columnMajor”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并传递存储在列主布局中的数据。当从使用行主布局的函数调用时,代码生成器将输入转换为列主布局,并将输出转换回行主布局。对于更短的语法,请使用gydF4y2Bacoder.ceval(坳,…)gydF4y2Ba。gydF4y2Ba

coder.ceval (gydF4y2Ba布局:任何的gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并通过当前数组布局传递数据,即使数组布局不匹配。代码生成器不转换输入或输出数据的数组布局。gydF4y2Ba

例子gydF4y2Ba

cfun_return = coder.ceval (gydF4y2Ba___gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba并返回单个标量值,gydF4y2Bacfun_returngydF4y2Ba函数中C/ c++函数返回的值gydF4y2Ba返回gydF4y2Ba声明。为了与C/ c++保持一致,gydF4y2Bacoder.cevalgydF4y2Ba只能返回标量值。它不能返回一个数组。将此选项与前面语法中的任何输入参数组合一起使用。gydF4y2Ba

例子gydF4y2Ba

全部折叠gydF4y2Ba

调用C函数gydF4y2Bafoo (u)gydF4y2Ba你想从一个MATLAB函数中生成C代码。gydF4y2Ba

创建一个C头文件gydF4y2Bafoo。gydF4y2Ba为一个函数gydF4y2Ba喷火gydF4y2Ba它接受两个类型的输入参数gydF4y2Ba双gydF4y2Ba并返回一个类型的值gydF4y2Ba双gydF4y2Ba。gydF4y2Ba

double foo(double in1, double in2);gydF4y2Ba

编写C函数gydF4y2Bafoo.cgydF4y2Ba。gydF4y2Ba

# include < stdio。h > # include < stdlib。h > # include " foo。h" double foo(double in1, double in2) {return in1 + in2;}gydF4y2Ba

写一个函数gydF4y2BacallfoogydF4y2Ba调用gydF4y2Ba喷火gydF4y2Ba通过使用gydF4y2Bacoder.cevalgydF4y2Ba。向函数中的代码生成器提供源文件和头文件。gydF4y2Ba

函数gydF4y2Bay = callfoogydF4y2Ba% # codegengydF4y2Bay = 0.0;gydF4y2Ba如果gydF4y2Bacoder.target (gydF4y2BaMATLAB的gydF4y2Ba)gydF4y2Ba%在MATLAB中执行,调用MATLAB等效的gydF4y2Ba% C函数foogydF4y2Bay = 10 + 20;gydF4y2Ba其他的gydF4y2Ba在生成的代码中执行,调用C函数foogydF4y2Bacoder.updateBuildInfo (gydF4y2Ba“addSourceFiles”gydF4y2Ba,gydF4y2Ba“foo.c”gydF4y2Ba);coder.cinclude (gydF4y2Ba“foo”gydF4y2Ba);y = coder.ceval (gydF4y2Ba“foo”gydF4y2Ba10、20);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

生成函数的C库代码gydF4y2BacallfoogydF4y2Ba。的gydF4y2BacodegengydF4y2Ba函数生成C代码gydF4y2Ba\ codegen \ lib \ callfoogydF4y2Ba子文件夹。gydF4y2Ba

codegengydF4y2Ba配置:自由gydF4y2BacallfoogydF4y2Ba报告gydF4y2Ba

从MATLAB代码调用一个C库函数。gydF4y2Ba

编写MATLAB函数gydF4y2BamyabsvalgydF4y2Ba。gydF4y2Ba

函数gydF4y2Bay = myabsval (u)gydF4y2Ba% # codegengydF4y2Bay = abs (u);gydF4y2Ba

生成一个C静态库gydF4y2BamyabsvalgydF4y2Ba,使用gydF4y2Baarg游戏gydF4y2Ba选项来指定输入参数的大小、类型和复杂性。gydF4y2Ba

codegengydF4y2Ba配置:自由gydF4y2BamyabsvalgydF4y2Baarg游戏gydF4y2Ba{0.0}gydF4y2Ba
的gydF4y2BacodegengydF4y2Ba函数创建库文件gydF4y2Bamyabsval.libgydF4y2Ba与头文件gydF4y2Bamyabsval.hgydF4y2Ba在文件夹gydF4y2Ba\ codegen \ lib \ myabsvalgydF4y2Ba。(库文件扩展名可以根据平台的不同而改变。)它生成函数gydF4y2Bamyabsval_initializegydF4y2Ba和gydF4y2Bamyabsval_terminategydF4y2Ba在同一个文件夹中。gydF4y2Ba

编写MATLAB函数调用生成的C函数库使用gydF4y2Bacoder.cevalgydF4y2Ba。gydF4y2Ba

函数gydF4y2Bay = callmyabsval (y)gydF4y2Ba% # codegengydF4y2Ba%检查目标。不要使用编码器。如果callmyabsval是cevalgydF4y2Ba%在MATLAB中执行gydF4y2Ba如果gydF4y2Bacoder.target (gydF4y2BaMATLAB的gydF4y2Ba)gydF4y2Ba%在MATLAB中执行,调用函数myabsvalgydF4y2Bay = myabsval (y);gydF4y2Ba其他的gydF4y2Ba%将必需的include语句添加到生成的函数代码中gydF4y2Bacoder.updateBuildInfo (gydF4y2Ba“addIncludePaths”gydF4y2Ba,gydF4y2Ba“美元(START_DIR) \ codegen \ lib \ myabsval 'gydF4y2Ba);coder.cinclude (gydF4y2Ba“myabsval_initialize.h”gydF4y2Ba);coder.cinclude (gydF4y2Ba“myabsval.h”gydF4y2Ba);coder.cinclude (gydF4y2Ba“myabsval_terminate.h”gydF4y2Ba);gydF4y2Ba%在生成的代码中执行。gydF4y2Ba%在调用gydF4y2Ba% C函数的第一次gydF4y2Bacoder.ceval (gydF4y2Ba“myabsval_initialize”gydF4y2Ba);gydF4y2Ba%调用生成的C库函数myabsvalgydF4y2Bay = coder.ceval (gydF4y2Ba“myabsval”gydF4y2Ba, y);gydF4y2Ba%在后面调用terminate函数gydF4y2Ba%最后一次调用C函数gydF4y2Bacoder.ceval (gydF4y2Ba“myabsval_terminate”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

生成MEX函数gydF4y2Bacallmyabsval_mexgydF4y2Ba。在命令行中提供生成的库文件。gydF4y2Ba

codegengydF4y2Ba配置:墨西哥人gydF4y2BacallmyabsvalgydF4y2Bacodegen \ lib \ myabsval \ myabsval.libgydF4y2Baarg游戏gydF4y2Ba{-2.75}gydF4y2Ba

不需要在命令行上提供库,您可以使用gydF4y2Bacoder.updateBuildInfogydF4y2Ba在函数中指定库。使用此选项预配置构建。把这一行加到gydF4y2Ba其他的gydF4y2Ba布洛克:gydF4y2Ba

coder.updateBuildInfo (gydF4y2Ba“addLinkObjects”gydF4y2Ba,gydF4y2Ba“myabsval.lib”gydF4y2Ba,gydF4y2Ba“美元(START_DIR) \ codegen \ lib \ myabsval 'gydF4y2Ba, 100年,真的,真的);gydF4y2Ba

运行MEX函数gydF4y2Bacallmyabsval_mexgydF4y2Ba哪个函数调用库函数gydF4y2BamyabsvalgydF4y2Ba。gydF4y2Ba

callmyabsval_mex (-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba

调用MATLAB函数gydF4y2BacallmyabsvalgydF4y2Ba。gydF4y2Ba

callmyabsval (-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba
的gydF4y2BacallmyabsvalgydF4y2Ba函数展示了在MATLAB中执行和代码生成所需的行为。gydF4y2Ba

使用gydF4y2Ba“全球”gydF4y2Ba在调用修改全局变量的C函数时标记。gydF4y2Ba

编写MATLAB函数gydF4y2BauseGlobalgydF4y2Ba调用C函数gydF4y2BaaddGlobalgydF4y2Ba。使用gydF4y2Ba“全球”gydF4y2Ba标志,向代码生成器指示C函数使用了全局变量。gydF4y2Ba

函数gydF4y2Bay = useGlobal ()gydF4y2Ba全球gydF4y2Bag;t = g;gydF4y2Ba%比较有/没有'-global'标志的执行情况gydF4y2Bacoder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Ba“addGlobal”gydF4y2Ba);y = t;gydF4y2Ba结束gydF4y2Ba

创建一个C头文件gydF4y2BaaddGlobal.hgydF4y2Ba函数的gydF4y2BaaddGlobalgydF4y2Ba。gydF4y2Ba

空白addGlobal(无效);gydF4y2Ba

编写C函数gydF4y2BaaddGlobalgydF4y2Ba在文件中gydF4y2BaaddGlobal.cgydF4y2Ba。这个函数包含头文件gydF4y2BauseGlobal_data.hgydF4y2Ba代码生成器在为函数生成代码时创建的gydF4y2BauseGlobalgydF4y2Ba。这个头文件包含的全局变量声明gydF4y2BaggydF4y2Ba。gydF4y2Ba

# include“addGlobal。h useGlobal_data # include。h" void addGlobal(void) {g++;}gydF4y2Ba

生成的MEX函数gydF4y2BauseGlobalgydF4y2Ba。要定义代码生成器的输入,请在工作空间中声明全局变量。gydF4y2Ba

全球gydF4y2Bag;g = 1;codegengydF4y2BauseGlobalgydF4y2Ba报告gydF4y2BaaddGlobal.hgydF4y2BaaddGlobal.cgydF4y2Bay = useGlobal_mex ();gydF4y2Ba

与gydF4y2Ba“全球”gydF4y2Ba标志时,MEX函数产生结果gydF4y2Bay = 1gydF4y2Ba。的gydF4y2Ba“全球”gydF4y2Ba标志向代码生成器指示C函数可能修改全局变量。为gydF4y2BauseGlobalgydF4y2Ba,代码生成器生成以下代码:gydF4y2Ba

real_T useGlobal(const emlrtStack *sp) {real_T y;(空白)sp;y = g;addGlobal ();返回y;}gydF4y2Ba

没有gydF4y2Ba“全球”gydF4y2Ba标志,MEX函数产生gydF4y2Bay = 2gydF4y2Ba。因为C函数没有修改的迹象gydF4y2BaggydF4y2Ba,代码生成器假定gydF4y2BaygydF4y2Ba和gydF4y2BaggydF4y2Ba都是相同的。生成的C代码如下:gydF4y2Ba

real_T useGlobal(const emlrtStack *sp) {(void)sp;addGlobal ();返回g;}gydF4y2Ba

假设你有一个C函数gydF4y2BatestRMgydF4y2Ba它被设计为使用行主布局。你想把这个函数集成到MATLAB函数中gydF4y2Ba酒吧gydF4y2Ba对数组进行操作。这个函数gydF4y2Ba酒吧gydF4y2Ba设计为使用列主布局,使用gydF4y2Bacoder.columnMajorgydF4y2Ba指令。gydF4y2Ba

函数gydF4y2Ba= bar ()gydF4y2Ba% # codegengydF4y2Bacoder.columnMajor;coder.ceval (gydF4y2Ba“布局:rowMajor”gydF4y2Ba,gydF4y2Ba“testRM”gydF4y2Ba,gydF4y2Ba…gydF4y2Bacoder.rref(在),coder.wref ());gydF4y2Ba结束gydF4y2Ba

在生成的代码中,代码生成器在变量上插入从列主布局到行主布局的布局转换gydF4y2Ba在gydF4y2Ba在传递给gydF4y2BatestRMgydF4y2Ba。关于输出变量gydF4y2Ba出gydF4y2Ba时,代码生成器会将布局转换插入到列主格式。gydF4y2Ba

一般来说,如果你不指定gydF4y2Ba布局gydF4y2Ba选择gydF4y2Bacoder.cevalgydF4y2Ba时,假定外部函数参数使用column-major。gydF4y2Ba

假设您有一个MATLAB函数,它调用自定义C代码,接受复数输入。您必须定义您的C代码输入参数,以便MATLAB函数的复数输入可以映射到您的C代码。gydF4y2Ba

在生成的代码中,复数被定义为agydF4y2Ba结构体gydF4y2Ba它有两个字段,gydF4y2Ba再保险gydF4y2Ba和gydF4y2Ba即时通讯gydF4y2Ba,它们分别是复数的实部和虚部。这gydF4y2Ba结构体gydF4y2Ba在头文件中定义gydF4y2Bartwtypes.hgydF4y2Ba你可以在gydF4y2Bacodegen \ lib \ functionNamegydF4y2Ba当前路径的文件夹。的gydF4y2Ba结构体gydF4y2Ba定义如下:gydF4y2Ba

typedef struct {real32_T re;/*Real Component*/ real32_T im;/*虚组件*/}creal32_T;gydF4y2Ba

有关更多信息,请参见gydF4y2Ba将MATLAB类型映射到生成代码中的类型gydF4y2Ba。gydF4y2Ba

要集成的C代码必须包含gydF4y2Bartwtypes.hgydF4y2Ba头文件。C代码示例gydF4y2Bafoo.cgydF4y2Ba如下所示:gydF4y2Ba

# include " foo。h”# include < stdio。h > # include < stdlib。h > # include“rtwtypes。h" double foo(creal32_T x) {double z = 0.0;z = x.re * x。再保险+ x.im*x.im; return (z); }

的gydF4y2Ba结构体gydF4y2Ba被命名为gydF4y2Bacreal32_TgydF4y2Ba。一个头文件gydF4y2Bafoo。gydF4y2Ba还必须定义为:gydF4y2Ba

# include“rtwtypes。h"双foo(creal32_T x);gydF4y2Ba

MATLAB代码执行gydF4y2Bafoo.cgydF4y2Ba通过使用gydF4y2Bacoder.cevalgydF4y2Ba输入为复数的函数:gydF4y2Ba

函数gydF4y2Bay = complexCevalgydF4y2Ba% # codegengydF4y2Bay = 0.0;coder.updateBuildInfo (gydF4y2Ba“addSourceFiles”gydF4y2Ba,gydF4y2Ba“foo.c”gydF4y2Ba);coder.cinclude (gydF4y2Ba“foo”gydF4y2Ba);y = coder.ceval (gydF4y2Ba“foo”gydF4y2Ba, 10 + 20);gydF4y2Ba结束gydF4y2Ba
的gydF4y2Bacoder.cevalgydF4y2Ba命令接受输入的复数。代码生成器将复数映射到gydF4y2Bastruct creal32_TgydF4y2Ba变量gydF4y2BaxgydF4y2Ba和它的字段gydF4y2Ba再保险gydF4y2Ba和gydF4y2Ba即时通讯gydF4y2Ba。gydF4y2Ba

为函数生成代码gydF4y2BacomplexCevalgydF4y2Ba通过运行这个命令:gydF4y2Ba

codegengydF4y2Ba配置:自由gydF4y2Ba报告gydF4y2BacomplexCevalgydF4y2Ba

输入参数gydF4y2Ba

全部折叠gydF4y2Ba

要调用的C/ c++外部函数的名称。gydF4y2Ba

例子:gydF4y2Bacoder.ceval(“foo”)gydF4y2Ba

数据类型:gydF4y2Ba字符gydF4y2Ba|gydF4y2Ba字符串gydF4y2Ba

以逗号分隔的输入参数列表,顺序为gydF4y2Bacfun_namegydF4y2Ba需要。gydF4y2Ba

例子:gydF4y2Bacoder.ceval (“foo”,10, 20);

例子:gydF4y2Bacoder.ceval ('myFunction', coder.ref(x));

数据类型:gydF4y2Ba单gydF4y2Ba|gydF4y2Ba双gydF4y2Ba|gydF4y2Baint8gydF4y2Ba|gydF4y2Baint16gydF4y2Ba|gydF4y2Baint32gydF4y2Ba|gydF4y2Baint64gydF4y2Ba|gydF4y2Bauint8gydF4y2Ba|gydF4y2Bauint16gydF4y2Ba|gydF4y2Bauint32gydF4y2Ba|gydF4y2Bauint64gydF4y2Ba|gydF4y2Ba逻辑gydF4y2Ba|gydF4y2Ba字符gydF4y2Ba|gydF4y2Ba结构体gydF4y2Ba
复数的支持:万博1manbetxgydF4y2Ba是的gydF4y2Ba

限制gydF4y2Ba

  • 你不能使用gydF4y2Bacoder.cevalgydF4y2Ba用于声明非本征的函数gydF4y2Bacoder.extrinsicgydF4y2Ba。gydF4y2Ba

  • 当LCC编译器创建库时,它会在库函数名前加上下划线。如果库的编译器是LCC,而你的代码生成编译器不是LCC,你必须在函数名前加上下划线,例如,gydF4y2Bacoder.ceval(“_mylibfun”)gydF4y2Ba。如果一个库的编译器不是LCC,您就不能使用LCC从调用该库函数的MATLAB代码中生成代码。这些库函数名没有LCC编译器要求的前导下划线。gydF4y2Ba

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的System object™属性,则不能通过引用将该属性传递给外部函数。看到gydF4y2Ba某些属性不支持引用传递万博1manbetxgydF4y2Ba。gydF4y2Ba

提示gydF4y2Ba

  • 对于代码生成,在调用之前gydF4y2Bacoder.cevalgydF4y2Ba时,必须指定返回值和输出参数的类型、大小和复杂性数据类型。gydF4y2Ba

  • 应用gydF4y2Bacoder.cevalgydF4y2Ba该函数接受或返回MATLAB代码中不存在的变量,如指针,gydF4y2Ba文件gydF4y2Ba文件I/O和C/ c++宏的类型,使用gydF4y2Bacoder.opaquegydF4y2Ba函数。gydF4y2Ba

  • 使用gydF4y2Bacoder.cevalgydF4y2Ba仅在MATLAB中进行代码生成。gydF4y2Bacoder.cevalgydF4y2Ba在未编译的MATLAB代码中生成一个错误。要确定一个MATLAB函数是否在MATLAB中执行,请使用gydF4y2Bacoder.targetgydF4y2Ba。如果函数在MATLAB中执行,调用C/ c++函数的MATLAB版本。gydF4y2Ba

介绍了R2011agydF4y2Ba