非本征函数

处理对函数的调用时喷火MATLAB中®的定义,则代码生成器查找喷火并为其主体生成代码。在某些情况下,您可能希望绕过代码生成,而是使用MATLAB引擎来执行调用。使用编码者外部('foo')来声明它喷火不生成代码,而是使用MATLAB引擎执行。在这种背景下,喷火被称为外部函数。只有当MATLAB引擎在MEX函数中可用或在coder.const在编译时调用。

如果为调用喷火,包括编码者外部('foo'),代码生成器尝试确定是否喷火影响输出。如果喷火不影响输出时,代码生成器继续进行代码生成,但排除喷火从生成的代码。否则,代码生成器将产生编译错误。

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

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

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

宣布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执行。

要测试该函数,请遵循以下步骤:

  1. 转换毕达哥拉斯通过在MATLAB提示符下执行下面的命令来修改MEX函数:

    codegen-报告毕达哥拉斯-args{1,1,3.3]}

  2. 点击链接到代码生成报告,然后,在报告中,查看MATLAB代码创建图

    报告强调了补丁函数表示它们仅在MATLAB环境中受支持。金宝app

  3. 通过执行该命令运行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使用函数宏指令功能

这个函数函数宏指令在代码生成期间自动解释为外部函数。因此,您可以使用函数宏指令方便地调用希望在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).如果输出没有改变,代码生成将继续进行,但是外部函数将被排除在生成的代码之外。否则,代码生成器将发出编译器错误。

使用mxArrays

外部函数的输出是mxArray-也称为MATLAB数组。唯一有效的操作MX阵列是:

  • 存储MX阵列在变量

  • 通过MX阵列返回函数并从函数返回它们

  • 转换MX阵列到运行时的已知类型

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

将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制适用:

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

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

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

    • 改变文件夹

    • 更改MATLAB路径

    • 删除或添加MATLAB文件

    • 更改警告状态

    • 更改MATLAB首选项

    • 更改Simul金宝appink参数

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

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

函数参数的限制

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