主要内容

coder.extrinsic

将一个函数声明为外部函数并在函数中执行MATLAB

描述

例子

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

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

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

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

请注意

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

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

coder.extrinsic (的同步:, function1,…functionN)允许在调用外部函数之前和之后,在MATLAB执行和生成的代码执行或Simulink模拟之间同步全局数据function1通过functionN.如果只有少数外部调用使用或修改全局数据,则通过将全局同步模式设置为,在所有外部函数调用之前和之后关闭同步在mex函数的入口和出口.使用的同步:选项仅为修改全局数据的外部调用启用同步。

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

看到为全局数据生成代码

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

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

看到为全局数据生成代码

例子

全部折叠

MATLAB函数补丁不支持代码生成。的功能补丁在生成的MEX函数中声明补丁作为你的MATLAB函数的外部函数。

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

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

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

请注意

这段代码调用补丁无需请求任何输出参数。在生成独立代码时,代码生成器会忽略此类调用。

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

codegen毕达哥拉斯arg游戏{1 1(。3。3。3)}报告

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

此图像显示了create_plot函数的代码,因为它出现在报告中。

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

执行MEX功能。

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

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

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

请注意

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

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

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

定义入口点函数

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

类型return_extrinsic_output.m
函数hasCycles = return_extrinsic_output(源,目标)code . external (' hasCycles ');断言(numel(源)== numel(目标))G =有向图(源,目标);hasCycles = hasCycles (G);结束

生成并调用MEX函数

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

codegenreturn_extrinsic_outputarg游戏{编码器。类型of(0,[1 Inf]),coder.typeof(0,[1 Inf])}报告
代码生成成功:要查看报告,请打开('codegen/mex/return_extrinsic_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]))

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

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

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

定义入口点函数

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

类型use_extrinsic_output
函数use_extrinsic_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 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_extrinsic_output/html/report.mldatx')

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

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

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

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

检查包含参数的XML文件

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

类型complex.xml
   . value 

定义xml2struct函数

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

类型xml2struct.m
函数= xml2struct(文件)s = struct();进口matlab.io.xml.dom。* doc = parseFile(解析器,文件);els = doc.getElementsByTagName (params);对于I = 0:els。getLength-1 it = els.item(i);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(theta) %#codegen code . external ("xml2struct");s = coder.const (xml2struct (complex.xml "));Comp = s.real + 1i * s.虚;级= abs (comp);相位=角(comp) + deg2rad(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 =罪(y_tmp);返回y;} /*代码生成的结束(rotate_complex.c) */

输入参数

全部折叠

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

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

数据类型:字符

限制

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

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

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

提示

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

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

扩展功能

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

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

版本历史

介绍了R2011a

Baidu
map