主要内容

coder.extrinsic

声明一个函数作为外在和执行MATLAB

描述

例子

coder.extrinsic (函数)声明函数作为一个非本征函数。代码生成器外在的身体不会产生代码,而是使用MATLAB函数®引擎执行调用。此功能只有当可用MATLAB引擎在执行期间是可用的。MATLAB引擎的情况下可用的例子包括墨西哥人的执行功能,仿真软件金宝app®模拟或函数调用时代码生成(也称为编译时)。

在独立的代码生成,代码生成器试图确定一个外部函数只有一个副作用(例如,通过显示一个图)或它是否影响的输出函数的调用(例如,通过返回一个值到一个输出变量)。如果没有改变输出,与代码生成代码生成器收入,但不包括非本征函数生成的代码。否则,代码生成器产生编译错误。

你不能使用coder.ceval在函数声明为外部使用coder.extrinsic。此外,coder.extrinsic代码生成外的指令将被忽略。

看到使用MATLAB引擎来执行一个函数调用生成的代码

请注意

代码生成器自动治疗很多常见MATLAB可视化功能,如情节,disp,外在。你不需要显式地声明他们是通过使用外部函数coder.extrinsic

coder.extrinsic (function1,。。。functionN)声明function1通过functionN非本征函数。

coder.extrinsic (的同步:,function1,…functionN)使之间的全局数据同步执行和生成的代码执行或仿真软件MATLAB仿真之前和之后调用外部函数金宝appfunction1通过functionN。如果只有几个外部调用使用或修改全局数据,关闭所有非本征函数调用之前和之后同步全球同步模式通过设置在MEX-function出入境。使用的同步:选择打开同步的外在要求做修改全局数据。

如果你使用MATLAB编码器™生成一个墨西哥人功能,的同步:选项允许验证MATLAB之间的恒定的全局数据的一致性和墨西哥人函数在调用外部函数。

看到为全局数据生成代码(MATLAB编码器)

coder.extrinsic (“同步:掉”,function1,…functionN)禁用同步MATLAB之间的全局数据和生成的代码执行前和执行后调用外部函数function1通过functionN。如果大多数外部调用使用或修改全局数据,但一些不使用“同步:掉”选择关闭同步的外在要求不要修改全局数据。

如果你使用MATLAB编码器生成一个墨西哥人功能,“同步:掉”选择禁用验证MATLAB之间的恒定的全局数据的一致性和墨西哥人函数在调用外部函数。

看到为全局数据生成代码(MATLAB编码器)

例子

全部折叠

MATLAB函数str2num不支持代码生成金宝app。这个例子展示了如何仍然可以使用的功能str2num在您生成的墨西哥人通过声明函数str2num在你的外在MATLAB函数。

这个MATLAB代码声明str2num外在的本地函数convertStringToNumber。通过声明str2num作为外在,你指导代码生成器生成的代码str2num。相反,代码生成器分派str2num为执行MATLAB。

函数n = convertStringToNumber (c)% # codegencoder.extrinsic (“str2num”);n = str2num (c);结束

生成一个墨西哥人功能convertStringToNumber

codegenconvertStringToNumberarg游戏{编码器。类型of('c', [1 Inf])}报告

在报告中,您可以查看生成的代码。

/ *函数定义* /静态常量mxArray * str2num (const emlrtStack * sp, const mxArray * m1, emlrtMCInfo *位置){const mxArray * m;const mxArray * pArray;pArray = 1;返回emlrtCallMATLABR2012b (a&m emlrtConstCTX sp, 1日,1,&pArray,“str2num”,的确,位置);}

在运行时输出一个外部函数返回是一个mxArray,也被称为一个MATLAB数组。唯一有效的操作mxArray将其存储在一个变量中,传递到另一个外在功能,或返回到MATLAB。在一个执行任何其他操作mxArray值,例如表达式中使用它在你的代码中,您必须转换mxArray到一个已知类型在运行时。执行此操作,分配mxArray一个变量,其类型已经由之前的任务。

这个例子展示了如何返回一个mxArrayMATLAB直接从一个外部函数输出。下一个例子显示了如何将相同的mxArray输出到一个已知类型,然后使用它在你的MATLAB函数表达式中。

定义入口点函数

定义一个MATLAB函数return_extrinsic_output接受源和目标为一个有向图节点指标作为输入,并确定是否无环通过使用图表hascycles函数。的hascycles功能不支持代码生成和被声明为外在金宝app。

类型return_extrinsic_output.m
函数hasCycles = return_extrinsic_output(源、目标)coder.extrinsic (“hasCycles”);断言(元素个数(源)= =元素个数(目标))G =有向图(源、目标);hasCycles = hasCycles (G);结束

生成并调用墨西哥人函数

生成的墨西哥人代码return_extrinsic_output。指定要无界输入向量类型的

codegenreturn_extrinsic_outputarg游戏{编码器。类型of(0,[1 Inf]),coder.typeof(0,[1 Inf])}报告
代码生成成功:查看报告,打开(“codegen /墨西哥人/ return_extrinsic_output / html / report.mldatx”)

调用生成的墨西哥人函数return_extrinsic_output_mex与合适的输入:

return_extrinsic_output ([1 2 4 4], [2 3 3 1])
ans =逻辑0

视觉检查如果有向图周期,情节MATLAB的有向图。

图(有向图([1 2 4 4],[2 3 3 1]))

图包含一个坐标轴对象。坐标轴graphplot类型的对象包含一个对象。

一个外部函数返回是一个的输出mxArray,也被称为一个MATLAB数组。唯一有效的操作mxArray将其存储在一个变量中,传递到另一个外在功能,或返回到MATLAB。在执行任何其他操作mxArray值,例如表达式中使用它在你的代码中,转换mxArray到一个已知类型在运行时。执行此操作,分配mxArray一个变量,其类型已经由之前的任务。

这个例子展示了如何转换mxArray一个外部函数的输出到一个已知类型,然后使用一个表达式在MATLAB中的输出函数。

定义入口点函数

定义一个MATLAB函数use_extrinsic_output接受源和目标为一个有向图节点指标作为输入,并确定是否无环通过使用图表hascycles函数。的hascycles功能不支持代码生成和被声明为外在金宝app。的入口点函数的输出显示一条消息hascycles函数。

类型use_extrinsic_output
函数use_extrinsic_output(源、目标)% # codegen断言(元素个数(源)= =元素个数(目标))G =有向图(源、目标);coder.extrinsic (“hascycles”);hasCycles = true;hasCycles = hasCycles (G);如果hasCycles = = true disp(图有周期的)其他disp(图没有周期的)结束

的局部变量hasCycles首先是预先指定的布尔值吗真正的在作业前hasCycles = hasCycles (G)发生。这种preassignment使转换的代码生成器mxArray非本征函数hascycles返回之前Bsoolean分配它hasCycles变量。这种转换将使您能够比较hasCycles与布尔真正的在的状况如果声明。

生成并调用墨西哥人函数

生成的墨西哥人代码use_extrinsic_output。指定要无界输入向量类型的翻倍。

codegenuse_extrinsic_outputarg游戏{编码器。类型of(0,[1 Inf]),coder.typeof(0,[1 Inf])}报告
代码生成成功:查看报告,打开(“codegen /墨西哥人/ use_extrinsic_output / html / report.mldatx”)

调用生成的墨西哥人函数use_extrinsic_output_mex与合适的输入:

use_extrinsic_output_mex ([1 2 4 4], [2 3 3 1])
图没有周期

是否有向图有周期,在MATLAB绘制图。

图(有向图([1 2 4 4],[2 3 3 1]))

图包含一个坐标轴对象。坐标轴graphplot类型的对象包含一个对象。

这个例子展示了如何调用一个外部函数的代码生成(也称为编译时)使用coder.const。由于MATLAB引擎总是可用在评价里面的表达式coder.const时,您可以使用这个编码模式生成墨西哥人或独立的代码。与前面的两个例子显示运行时执行,您不需要显式地将外在的输出函数到一个已知类型的评价在编译时发生。

在这个例子中,入口点函数rotate_complex调用另一个函数xml2struct使用MATLAB对XML处理API。因为代码生成不支持MATLAB用于XML处理API,金宝appxml2struct函数声明为外在的身体的入口点函数。同时,调用xml2struct里面的入口点函数返回一个编译时常量。这个输出是constant-folded通过将内部的函数调用coder.const指令。

检查XML文件包含参数

支持文件金宝appcomplex.xml的值包含一个复数的实部和虚部。

类型complex.xml
<参数> < param name =“真实”value = " 3 " / > < param name = "虚" value = " 4 " / > < /参数>

定义xml2struct函数

MATLAB函数xml2struct读取一个XML文件,使用的格式complex.xml存储参数名称和值,存储此信息结构字段,并返回这个结构。

类型xml2struct.m
函数s = xml2struct(文件)s =结构();进口matlab.io.xml.dom。*医生= parseFile(解析器,文件);els = doc.getElementsByTagName (params);因为我= 0:隧道。getLength-1它= els.item(我);ps = it.getElementsByTagName(“参数”);j = 0: ps。getLength-1参数= ps.item (j);paramName = char (param.getAttribute("名称")); paramValue = char(param.getAttribute("value")); paramValue = evalin("base", paramValue); s.(paramName) = paramValue; end end

定义入口点函数

你的MATLAB入口点函数rotate_complex第一次调用xml2struct读文件complex.xml。然后它的复数旋转一个角度,等于输入参数θ度和返回结果的复数。

类型rotate_complex.m
函数y = rotate_complex(θ)% # codegen coder.extrinsic (“xml2struct”);s = coder.const (xml2struct (complex.xml "));comp =。真正的+ 1我* s.imaginary;级= abs (comp);相函数=角(comp) +(θ);y =级* cos(阶段)+ 1我* sin(阶段);结束

xml2struct函数声明为外在constant-folded及其输出的方法是将内部的函数coder.const指令。

生成和检查静态库

生成一个静态库read_complex通过使用codegen(MATLAB编码器)命令。指定输入类型是一个标量的两倍。

codegen配置:自由rotate_complexarg游戏{0}报告
警告:使用编码器生成代码。EmbeddedCodeConfig对象。因为嵌入式编码器没有安装,这可能导致一些嵌入式编码器功能失败。代码生成成功(警告):查看报告,打开(“codegen / lib / rotate_complex / html / report.mldatx”)

检查生成的c++文件rotate_complex.c。观察到的输出xml2struct函数是硬编码在生成的代码中。

类型codegen / lib / rotate_complex / rotate_complex.c
/ * *文件:rotate_complex。c * * MATLAB编码器版本:5.6 * c / c++源代码生成:03 - mar - 2023 04:52:48 * / / *包含文件* / # Include " rotate_complex。h”# include <数学。h > / * * / / * *函数定义参数:双θ*返回类型:creal_T * / creal_T rotate_complex(双θ){creal_T y;双y_tmp;y_tmp = 0.017453292519943295 *θ+ 0.92729521800161219;y。re = 5.0 * cos (y_tmp);y。我=罪(y_tmp);返回y; } /* * File trailer for rotate_complex.c * * [EOF] */

输入参数

全部折叠

名字的MATLAB函数声明为外在。

例子:coder.extrinsic(“补丁”)

数据类型:字符

限制

  • 非本征函数调用一些开销,如何影响性能。输入数据传入必须提供一个外部函数调用MATLAB,需要复制的数据。如果函数有任何输出数据,这些数据必须传输回墨西哥人功能的环境,也需要一个副本。

  • 代码生成器不支持使用金宝appcoder.extrinsic调用的函数都位于一个私人文件夹。

  • 代码生成器不支持使用金宝appcoder.extrinsic调用本地函数。

提示

  • 代码生成器自动治疗很多常见MATLAB可视化功能,如情节,disp,外在。你不需要显式地声明他们是通过使用外部函数coder.extrinsic

  • 使用coder.screener函数来检测你必须声明为外在功能。这个函数运行代码生成准备工具,屏幕的MATLAB代码特性和功能不支持代码生成。金宝app

扩展功能

C / c++代码生成
生成C和c++代码使用MATLAB®编码器™。

GPU的代码生成
生成NVIDIA的CUDA®代码®GPU使用GPU编码器™。

版本历史

介绍了R2011a