主要内容

coder.extrinsic

将函数声明为外部函数并在内部执行MATLAB

描述

例子

coder.extrinsic (函数声明函数作为一个外在函数。代码生成器不为外部函数体生成代码,而是使用MATLAB®引擎执行调用。只有在执行期间MATLAB引擎可用时,此功能才可用。MATLAB引擎可用的情况示例包括执行MEX函数,Simulink金宝app®模拟,或代码生成时的函数调用(也称为编译时)。

在独立代码生成期间,代码生成器尝试确定外部函数是否只具有副作用(例如,通过显示图形),还是它是否影响调用它的函数的输出(例如,通过向输出变量返回值)。如果输出没有变化,代码生成器将继续进行代码生成,但将外部函数从生成的代码中排除。否则,代码生成器将产生编译错误。

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

看到使用MATLAB引擎在生成的代码中执行函数调用

请注意

代码生成器自动处理许多常见的MATLAB可视化函数,例如情节disp,数字,是外在的。您不必使用显式地将它们声明为外部函数coder.extrinsic

coder.extrinsic (function1,...functionN)声明function1通过functionN作为外部函数。

coder.extrinsic (的同步:,函数1,…functionN)在调用外部函数之前和之后,实现MATLAB执行和生成代码执行或Simulink仿真之间的全局数据同步金宝appfunction1通过functionN.如果只有少数外部调用使用或修改全局数据,则通过将全局同步模式设置为,在所有外部函数调用之前和之后关闭同步在mex -函数进入和退出.使用的同步:选项,仅对修改全局数据的外部调用启用同步。

如果你使用MATLAB编码器™生成MEX函数时,使用的同步:选项可以在调用外部函数后验证MATLAB和MEX函数之间的常量全局数据的一致性。

看到为全局数据生成代码

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

如果你使用MATLAB编码器生成MEX函数时,使用“同步:掉”选项禁止在调用外部函数后验证MATLAB和MEX函数之间的常量全局数据的一致性。

看到为全局数据生成代码

例子

全部折叠

MATLAB函数补丁不支持代码生成金宝app。的功能,这个示例展示了如何仍然可以使用补丁在您生成的MEX函数中通过声明补丁作为外部的MATLAB函数。

这个MATLAB代码声明补丁在局部函数中是外部的create_plot.通过声明补丁作为外部因素,您指示代码生成器不为补丁.相反,代码生成器进行分派补丁到MATLAB中执行。

代码生成器自动处理许多常见的MATLAB可视化函数,如函数这段代码使用,作为外部的。

函数C =毕达哥拉斯(a,b,color)% # codegen计算一个直角三角形的斜边%,并将三角形显示为补丁对象。C =√(a^2 + b^2);Create_plot (a, b, color);结束函数Create_plot (a, b, color)声明补丁为外部补丁coder.extrinsic (“补丁”);X = [0;a;a];Y = [0;0;b];补丁(x, y,颜色);轴(“平等”);结束

请注意

这段代码调用补丁不需要任何输出参数。在生成独立代码时,代码生成器会忽略这样的调用。

生成的MEX函数毕达哥拉斯.另外,生成代码生成报告。

codegen毕达哥拉斯arg游戏{1,1, [.]3 .3 .3]}报告

在报告中,查看的MATLAB代码create_plot

该图像显示了报告中create_plot函数的代码。

该报告强调补丁而且函数,表明它们被视为外部函数。

2 .执行MEX功能。

Pythagoras_mex (3,4, [1.0 0.0 0.0]);

MATLAB将直角三角形的图形显示为红色补丁对象。

此图像显示了运行MEX函数时生成的图形。

请注意

而不是通过使用codegen命令时,还可以放置该功能毕达哥拉斯在一个MATLAB函数块在Simulink模金宝app型中。当您模拟模型时,MATLAB函数Block的行为与pythagoras_mex

外部函数在运行时返回的输出是mxArray,也称为MATLAB数组。的唯一有效操作mxArray将它存储在一个变量中,传递给另一个外部函数,或者返回给MATLAB。对象上执行任何其他操作mxArray值,例如在代码中的表达式中使用它,则必须转换mxArray到运行时的已知类型。要执行此操作,请指定mxArray到一个类型已经由先前赋值定义的变量。

此示例演示如何返回mxArray从外部函数直接输出到MATLAB。下一个示例演示如何转换相同的内容mxArray输出到已知类型,然后在MATLAB函数内的表达式中使用它。

定义入口点函数

定义一个MATLAB函数return_extrinsic_output方法接受有向图的源节点和目标节点索引作为输入,并确定图是否为非循环图hascycles函数。的hascycles函数不支持代码生成,并且声明为外金宝app部函数。

类型return_extrinsic_output.m
函数hasCycles = return_extrincic_output(源,目标)code .extrinsic(' hasCycles ');assert(数字(源)==数字(目标))G =有向图(源,目标);hasCycles = hasCycles (G);结束

生成和调用MEX函数

为以下对象生成MEX代码return_extrinsic_output.将输入指定为类型为无界的向量

codegenreturn_extrinsic_outputarg游戏{编码器。类型of(0,[1 Inf]),coder.typeof(0,[1 Inf])}报告
要查看报告,打开('codegen/mex/ return_extrincic_output /html/report.mldatx')

调用生成的MEX函数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]))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

外部函数返回的输出是mxArray,也称为MATLAB数组。的唯一有效操作mxArray将它存储在一个变量中,传递给另一个外部函数,或者返回给MATLAB。对。执行任何其他操作mxArray值,例如在代码中的表达式中使用它,则转换mxArray到运行时的已知类型。要执行此操作,请指定mxArray到一个类型已经由先前赋值定义的变量。

此示例显示如何转换mxArray外部函数的输出到已知类型,然后在MATLAB函数内部的表达式中使用输出。

定义入口点函数

定义一个MATLAB函数use_extrinsic_output方法接受有向图的源节点和目标节点索引作为输入,并确定图是否为非循环图hascycles函数。的hascycles函数不支持代码生成,并且声明为外金宝app部函数。类的输出显示一条消息hascycles函数。

类型use_extrinsic_output
函数use_extrincic_output (source,target) %#codegen assert(numel(source) == numel(target)) G =有向图(source,target);coder.extrinsic(“hascycles”);hasCycles = true;hasCycles = hasCycles (G);if hasCycles == true disp('这个图有周期')else disp('这个图没有周期')end结束

局部变量hasCycles是否首先预先分配布尔值真正的作业之前hasCycles = hasCycles (G)发生。此预赋值使代码生成器能够转换mxArray这是外在函数hascycles对象赋值之前返回Bsoolean对象hasCycles变量。这种转换反过来又使您能够进行比较hasCycles布尔值真正的在这种情况下如果声明。

生成和调用MEX函数

为以下对象生成MEX代码use_extrinsic_output.将输入指定为double类型的无界向量。

codegenuse_extrinsic_outputarg游戏{编码器。类型of(0,[1 Inf]),coder.typeof(0,[1 Inf])}报告
要查看报告,打开('codegen/mex/ use_extrincic_output /html/report.mldatx')

调用生成的MEX函数use_extrinsic_output_mex适当的输入:

use_extrincic_output_mex ([1 2 4 4],[2 3 3 1])
这个图没有循环

要查看有向图是否有循环,请在MATLAB中绘制该图。

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

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

这个例子展示了如何在代码生成时(也称为编译时)调用外部函数coder.const.因为在计算表达式时,MATLAB引擎总是可用的coder.const,您可以在生成MEX或独立代码时使用此编码模式。与前两个演示运行时执行的示例不同,如果外部函数的计算发生在编译时,则不需要显式地将其输出转换为已知类型。

在本例中,是入口点函数rotate_complex调用另一个函数xml2struct它使用MATLAB API进行XML处理。由于代码生成不支持用于XML处理的MATLAB API,因此金宝appxml2struct函数在入口点函数体中声明为外部函数。还有,调用xml2struct在入口点函数内部返回一个编译时常数。因此,通过将函数调用放在coder.const指令。

检查包含参数的XML文件

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

类型complex.xml
   

定义xml2struct函数

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

类型xml2struct.m
函数s = xml2struct(file) s = struct();进口matlab.io.xml.dom。* doc = parseFile(解析器,文件);els = doc.getElementsByTagName("params");对于I = 0:els。getLength-1 it = els.item(i);ps = it.getElementsByTagName("param");当j = 0时:ps。getLength-1 param = ps.item(j);paramName = char(param.getAttribute("name")); 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(theta) %#codegen code .extrinsic("xml2struct");S = code .const(xml2struct("complex.xml"));Comp = s.real + 1i * s.imaginary;幅度= abs(comp);相位=角(comp) +度(theta);Y =模* cos(相位)+ 1i * sin(相位);结束

xml2struct函数被声明为外部函数,其输出被常量折叠,方法是将函数置于coder.const指令。

生成和检查静态库

生成的静态库read_complex通过使用codegen命令。将输入类型指定为标量双精度。

codegen配置:自由rotate_complexarg游戏{0}报告
要查看报告,打开('codegen/lib/rotate_complex/html/report.mldatx')

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

类型codegen / lib / rotate_complex / rotate_complex.c
/* * rotate_complex.c * *函数'rotate_complex'的代码生成* */ /*包含文件*/ # Include "rotate_complex.h" # Include  /*函数定义*/ creal_T rotate_complex(double theta) {creal_T y;双y_tmp;Y_tmp = 0.017453292519943295 * theta + 0.92729521800161219;Y.re = 5.0 * cos(y_tmp);Y.im = sin(y_tmp);返回y;} /*代码生成结束(rotate_complex.c) */

输入参数

全部折叠

声明为外部函数的MATLAB函数的名称。

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

数据类型:字符

限制

  • 外部函数调用有一些开销,可能会影响性能。在外部函数调用中传递的输入数据必须提供给MATLAB,这需要对数据进行复制。如果函数有任何输出数据,则必须将该数据传输回MEX函数环境,这也需要一个副本。

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

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

提示

  • 代码生成器自动处理许多常见的MATLAB可视化函数,例如情节disp,数字,是外在的。您不必使用显式地将它们声明为外部函数coder.extrinsic

  • 使用coder.screener函数来检测哪些函数必须声明为外部函数。此函数运行代码生成准备工具(Code Generation Readiness Tool),该工具可以筛选MATLAB代码中不支持代码生成的特性和函数。金宝app

扩展功能

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

GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。

版本历史

在R2011a中引入