主要内容

非本征函数

处理对函数的调用时喷火在MATLAB中®代码,代码生成器找到的定义喷火并为它的身体生成代码。在某些情况下,您可能希望绕过代码生成,而是使用MATLAB引擎来执行调用。使用coder.extrinsic(“foo”)声明调用喷火不生成代码,而是使用MATLAB引擎执行。在这种情况下,喷火被称为外部函数。此功能仅当MATLAB引擎在MEX函数或期间可用时可用coder.const在编译时调用。

如果为调用的函数生成独立代码喷火,包括coder.extrinsic(“foo”)时,代码生成器尝试确定是否喷火影响输出。如果喷火不影响输出,代码生成器进行代码生成,但排除喷火从生成的代码。否则,代码生成器将产生编译错误。

代码生成器自动处理许多常见的MATLAB可视化函数,例如情节disp,数字,是外在的。您不必使用显式地将它们声明为外部函数coder.extrinsic.例如,您可能想要调用情节在MATLAB环境中可视化您的结果。如果从调用的函数生成MEX函数情节,然后运行生成的MEX函数,代码生成器将调用分派到情节函数到MATLAB引擎。类的调用,则生成的代码不包含对库或可执行文件的调用情节函数。代码生成报告强调了从MATLAB代码到外部函数的调用,因此很容易确定哪些函数仅在MATLAB环境中受支持。金宝app

对于普通可视金宝app化函数以外的不受支持的函数,必须将这些函数声明为外部函数(参见代码生成中函数调用的解析).外部函数不编译,而是在仿真期间在MATLAB中执行(参见模拟过程中外部函数的解析).

有两种方法将函数声明为外部函数:

声明MATLAB函数作为外在函数

要将MATLAB函数声明为外部函数,请添加coder.extrinsic在主函数或局部函数的顶部构造:

coder.extrinsic ('function_name_1”,……”,function_name_n”);

声明外部函数

下面的代码声明MATLAB补丁局部函数中的外部函数create_plot.你不必申报作为外在的原因是一种常见的可视化函数,代码生成器自动将其视为外部函数。

function c = pythagoras(a,b,color) %#codegen %计算直角三角形的斜边%并显示该三角形。C =√(a^2 + b^2);Create_plot (a, b, color);将补丁声明为外部补丁coder.extrinsic(“补丁”);X = [0;a;a];Y = [0;0;b];Patch (x, y, color);轴(“平等”);

代码生成器不会生成用于的代码补丁而且,而是将它们分派到MATLAB中执行。

要测试该函数,请执行以下步骤:

  1. 转换毕达哥拉斯通过在MATLAB提示符下执行此命令,将其转换为MEX函数:

    Codegen -report Pythagoras -args{1,1,[。3 .3 .3]}

  2. 单击代码生成报告的链接,然后在报告中查看的MATLAB代码create_plot

    该报告强调补丁而且函数,以表明它们仅在MATLAB环境中受支持。金宝app

  3. 执行该命令运行MEX功能:

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

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

何时使用编码器。外在构造

使用coder.extrinsic构造:

外部函数声明规则

在代码生成中声明外部函数时,请遵守以下规则:

  • 在调用函数之前,将其声明为外部函数。

  • 不要在条件语句中使用外部声明。

外部函数声明的范围

coder.extrinsic构造具有函数作用域。例如,考虑以下代码:

函数y = foo %#codegen code .extrinsic('rat','min');[N D] =鼠(pi);Y = 0;y = min(N, D);

在这个例子中,老鼠而且最小值每次在主函数中调用它们时,它们都被视为外部的喷火.有两种方法可以缩小main函数内部外部声明的范围:

  • 在局部函数中声明MATLAB函数为外部函数,如下例所示:

    函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);Y = 0;y = mymin(N, D);函数y = mymin(a,b) code .extrinsic('min');Y = min(a,b);

    这里是函数老鼠每次在主函数内部调用它都是外在的吗喷火,但是函数最小值只有在局部函数内部调用时才是外部的吗mymin

  • 调用MATLAB函数使用函数宏指令,详见使用feval调用MATLAB函数

调用MATLAB使用feval函数

这个函数函数宏指令在代码生成期间自动解释为外部函数。因此,您可以使用函数宏指令方便地调用要在MATLAB环境中执行的函数,而不是编译为生成的代码。

考虑下面的例子:

函数y = foo code .extrinsic('rat');[N D] =鼠(pi);Y = 0;y = feval('min', N, D);

因为函数宏指令外在的,陈述feval('min', N, D)由MATLAB计算-不是编译-与声明函数有相同的结果最小值对于这一个调用来说是外部的。相比之下,函数老鼠整个函数都是外在的吗喷火

的代码生成器不支持使用金宝app函数宏指令调用位于私有文件夹中的本地函数或函数。

非静态方法的外部声明

假设您定义了一个类myClass它有一个非静态方法喷火,然后创建实例obj这一类的。如果你想声明这个方法obj.foo在你的MATLAB代码中,你打算进行代码生成,遵循这些规则:

  • 将调用写入喷火作为函数调用。不要使用点符号来编写调用。

  • 声明喷火通过使用语法成为外在的coder.extrinsic(“foo”)

例如,定义myClass为:

函数y = foo(obj,x) y = obj。Prop + x;结束结束

下面是一个MATLAB函数的例子喷火外在。

函数y = myFunction(x) %#codegen code .extrinsic('foo');obj = myClass;Y = foo(obj,x);结束

非静态方法也称为普通方法。看到定义类方法和函数

模拟过程中外部函数的解析

代码生成器解析对外部函数的调用——不支持代码生成的函数——如下所示:金宝app

在模拟过程中,代码生成器为外部函数的调用生成代码,但不为函数生成内部代码。因此,只能在安装MATLAB软件的平台上运行仿真。

在代码生成期间,代码生成器尝试确定外部函数是否影响调用它的函数的输出——例如返回mxArrays到输出变量(参见使用mxArrays).如果输出没有改变,代码生成将继续进行,但外部函数将从生成的代码中排除。否则,代码生成器将发出编译器错误。

使用mxArrays

一个外部函数的输出是mxArray——也叫MATLAB数组。唯一有效的操作mxArrays是:

  • 存储mxArrays在变量

  • 通过mxArrays并从函数中返回它们

  • 转换mxArrays到运行时的已知类型

使用mxArrays由其他操作中的外部函数返回,必须首先将它们转换为已知类型,如中所述将mxArrays转换为已知类型

将mxArrays转换为已知类型

转换mxArray赋值给已知类型mxArray到已定义类型的变量。在运行时,mxArray转换为赋值给它的变量的类型。但是,如果数据在mxArray与变量的类型不一致,则会得到一个运行时错误。

例如,考虑以下代码:

函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);y = min(N, D);

这里是顶层函数喷火调用外部函数老鼠,返回2mxArrays表示分子N和分母D的有理分式近似π.虽然你可以通过这些mxArrays到另一个MATLAB函数-在这种情况下,最小值属性不能赋值mxArray返回的最小值到输出y

如果你运行这个函数喷火Simulink中的函数块金宝app®模型,代码在模拟过程中产生如下错误:

函数输出'y'不能是MATLAB类型。

要解决这个问题,请定义y为所期望的值的类型和大小最小值在本例中,返回一个标量double,如下所示:

函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);Y = 0;定义y为类型为double的标量y = min(N,D);

代码生成外部函数的限制

在代码生成期间不支持完整的MATLAB运行时环境。金宝app因此,在外部调用MATLAB函数时应用以下限制:

  • 检查调用方或读取或写入调用方工作区的MATLAB函数在代码生成期间不起作用。这些职能包括:

  • MATLAB调试器不能检查外部函数中定义的变量。

  • 如果你的外部函数在运行时执行以下操作,生成代码中的函数可能会产生不可预测的结果:

    • 改变文件夹

    • 更改MATLAB路径

    • 删除或添加MATLAB文件

    • 更改警告状态

    • 更改MATLAB首选项

    • 更改Simul金宝appink参数

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

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

函数实参限制

您最多可以调用64个输入和64个输出的函数。