处理对函数的调用时喷火
MATLAB中®的定义,则代码生成器查找喷火
并为其主体生成代码。在某些情况下,您可能希望绕过代码生成,而是使用MATLAB引擎来执行调用。使用编码者外部('foo')
来声明它喷火
不生成代码,而是使用MATLAB引擎执行。在这种背景下,喷火
被称为外部函数。只有当MATLAB引擎在MEX函数中可用或在coder.const
在编译时调用。
如果为调用喷火
,包括编码者外部('foo')
,代码生成器尝试确定是否喷火
影响输出。如果喷火
不影响输出时,代码生成器继续进行代码生成,但排除喷火
从生成的代码。否则,代码生成器将产生编译错误。
代码生成器自动处理许多常见的MATLAB可视化函数,例如情节
,disp
,图形
外在。你不需要使用显式声明它们为外部函数coder.extrinsic
. 例如,您可能想打电话情节
以便在MATLAB环境中可视化结果。如果您从调用情节
,然后运行生成的MEX函数,代码生成器向情节
函数到MATLAB引擎。如果生成库或可执行文件,则生成的代码不包含对情节
代码生成报告突出显示了从MATLAB代码到外部函数的调用,因此很容易确定哪些函数仅在MATLAB环境中受支持。金宝app
对于普通可视金宝app化函数以外的不受支持的函数,必须将函数声明为外部函数(请参见解析代码生成中的函数调用).外部函数不编译,而是在MATLAB仿真期间执行(参见模拟过程中外部函数的分辨率).
有两种方法可以将函数声明为外部的:
使用coder.extrinsic
在主函数或局部函数中构造(参见将MATLAB函数声明为外部函数).
使用间接调用函数函数宏指令
(见使用feval调用MATLAB函数).
要声明一个MATLAB函数是外部的,添加coder.extrinsic
构造在main函数或局部函数的顶部:
coder.extrinsic ('函数名称1”,……, 'function_name_n');
下面的代码声明了MATLAB补丁
函数在局部函数中创建图
.你不必申报轴
作为外在的,因为轴
是代码生成器自动视为外部的常见可视化函数之一。
函数c = pythagoras(a,b,color) %#codegen %计算直角三角形的斜边%并显示三角形。C =√(a^2 + b^2)create_plot (a, b,颜色);函数create_plot(a, b, color) %声明补丁为外部的coder.extrinsic(“补丁”);x = [0;;];y = (0, 0; b);补丁(x, y,颜色);轴(“平等”);
代码生成器不为生成代码补丁
和轴
,但将它们发送到MATLAB执行。
要测试该函数,请遵循以下步骤:
转换毕达哥拉斯
通过在MATLAB提示符下执行下面的命令来修改MEX函数:
codegen-报告毕达哥拉斯-args{1,1,3.3]}
点击链接到代码生成报告,然后,在报告中,查看MATLAB代码创建图
.
报告强调了补丁
和轴
函数表示它们仅在MATLAB环境中受支持。金宝app
通过执行该命令运行MEX功能:
Pythagoras_mex (3,4, [1.0 0.0 0.0]);
MATLAB将直角三角形的图形显示为一个红色补丁对象:
使用coder.extrinsic
构造:
调用在模拟过程中不会产生输出的MATLAB函数,而不会产生不必要的代码(参见模拟过程中外部函数的分辨率).
使您的代码自文档化并更容易调试。您可以扫描源代码coder.extrinsic
语句来隔离对MATLAB函数的调用,这些函数可能会创建和传播MX阵列
(见使用mxArrays).
节省打字。与一个coder.extrinsic
语句时,每个后续函数调用都是外部的,只要调用和语句处于相同的作用域(参见外部函数声明的范围).
在整个调用函数范围内声明MATLAB函数的外部(参见外部函数声明的范围).为了缩小范围,使用函数宏指令
(见使用feval调用MATLAB函数).
声明用于代码生成的外部函数时,请遵守以下规则:
在调用函数之前将其声明为外部函数。
不要在条件语句中使用外部声明。
的coder.extrinsic
构造具有功能范围。例如,考虑下面的代码:
函数y = foo %#codegen codeder .extrinsic('rat','min');[N D] =大鼠(pi);y = 0;y = min(N, D);
在这个例子中,老鼠
和最小值
每次在主函数中调用它们时都被视为外部的喷火
.有两种方法可以缩小main函数内部外部声明的作用域:
在一个局部函数中声明MATLAB函数的外部属性,如下例所示:
函数y = foo %#codegen codeder .extrinsic('rat');[N D] =大鼠(pi);y = 0;y = mymin(N, D);函数y = mymin(a,b) code . external ('min');y = min (a, b);
在这里,这个函数老鼠
每次在主函数内调用时都是外部的喷火
,但函数最小值
仅当在局部函数内调用时才是外部的mymin
.
使用调用MATLAB函数函数宏指令
,如使用feval调用MATLAB函数.
这个函数函数宏指令
在代码生成期间自动解释为外部函数。因此,您可以使用函数宏指令
方便地调用希望在MATLAB环境中执行的函数,而不是编译成生成的代码。
考虑下面的例子:
函数y = foo code .extrinsic('rat');[N D] =大鼠(pi);y = 0;y = feval('min', N, D);
因为函数宏指令
是外在的,陈述吗feval('min',N,D)
是由MATLAB评估的-没有编译-有相同的结果声明的函数最小值
对于这一个调用来说是外在的。相比之下,函数老鼠
整个函数都是外在的吗喷火
.
代码生成器不支持使用金宝app函数宏指令
调用本地函数或位于专用文件夹中的函数。
假设您定义了一个类我的班级
它有一个非静态的方法喷火
,然后创建一个实例obj
这个类的。如果你想声明这个方法obj.foo
作为MATLAB代码中用于生成代码的外部代码,请遵循以下规则:
把电话写给喷火
作为函数调用。不要使用点符号来编写调用。
声明喷火
通过使用语法变得外在编码者外部('foo')
.
例如,定义我的班级
为:
function y = foo(obj,x) y = obj. class ()道具+ x;结束结束结束
下面是一个示例MATLAB函数,它声明喷火
外在。
函数y = myFunction(x) %#codegen code .extrinsic('foo');obj = myClass;y = foo (obj, x);结束
非静态方法也称为普通方法。看到定义类方法和函数.
代码生成器解析对外部函数(不支持代码生成的函数)的调用,如下所示:金宝app
在模拟过程中,代码生成器为调用外部函数生成代码,但不为函数生成内部代码。因此,您只能在安装MATLAB软件的平台上运行模拟。
在代码生成期间,代码生成器试图确定外部函数是否影响调用它的函数的输出—例如通过返回MX阵列
转换为输出变量(参见使用mxArrays).如果输出没有改变,代码生成将继续进行,但是外部函数将被排除在生成的代码之外。否则,代码生成器将发出编译器错误。
外部函数的输出是mxArray
-也称为MATLAB数组。唯一有效的操作MX阵列
是:
存储MX阵列
在变量
通过MX阵列
返回函数并从函数返回它们
转换MX阵列
到运行时的已知类型
使用MX阵列
由其他操作中的外部函数返回,必须首先将它们转换为已知类型,如将MXArray转换为已知类型.
转换mxArray
为已知类型指定mxArray
指向已定义类型的变量。在运行时mxArray
转换为分配给它的变量的类型。但是,如果mxArray
与变量的类型不一致,则会出现运行时错误。
例如,考虑以下代码:
函数y = foo %#codegen codeder .extrinsic('rat');[N D] =大鼠(pi);y = min(N, D);
这里是顶级函数喷火
调用外部函数老鼠
,返回2MX阵列
代表分子的N
和分母D
的有理分式逼近π
.尽管你可以通过这些考试MX阵列
到另一个MATLAB函数-在本例中,最小值
-您不能分配mxArray
返回的最小值
到输出y
.
如果你运行这个函数喷火
在Simulink中的MATLAB函数块金宝app®模型,代码在仿真过程中产生如下错误:
函数输出“y”不能是MATLAB类型。
要解决这个问题,请定义y
是您期望的值的类型和大小最小值
要返回-在本例中为标量双精度-如下所示:
函数y = foo %#codegen codeder .extrinsic('rat');[N D] =大鼠(pi);y = 0;定义y为double类型的标量y = min(N,D);
代码生成期间不支持完整的MATLAB运行时环境。因此,外部调用MATLAB函数时,以下限金宝app制适用:
您可以调用多达64个输入和64个输出的函数。