主要内容

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

处理对函数的调用时喷火在你的matlab中®的定义时,代码生成器会找到喷火并为其身体生成代码。在某些情况下,您可能希望绕过代码生成,然后使用MATLAB引擎执行呼叫。使用coder.extrinsic(“foo”)来声明调用喷火不生成代码,而是使用MATLAB引擎执行。在这种背景下,喷火被称为一个外在的功能。只有当MATLAB引擎在执行期间可用时,该功能才可用。这种情况的例子包括执行MEX函数、Simulink金宝app®代码生成时的仿真或函数调用(也称为编译时).

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

包括coder.extrinsic(“foo”)指令在特定的MATLAB函数声明所有调用喷火内部的MATLAB函数作为外部的。或者,您可能希望将外部声明的范围缩小到只有一个调用喷火.看到使用feval调用matlab函数(MATLAB编码器)

何时将函数声明为外部函数

以下是一些常见的情况,你可以考虑声明一个MATLAB函数为外在的:

  • 该函数执行显示或记录操作。此类功能主要是在仿真期间的用途,并且不用于嵌入式系统。

  • 在MEX执行或Simulink模拟中,您希望使用不金宝app支持代码生成的MATLAB函数。金宝app此工作流不适用于非模拟目标。

  • 您指示代码生成器通过使用持续折叠函数调用Coder.Const..在这种情况下,只有在代码生成期间,当MATLAB引擎可用来执行调用时,才会调用该函数。

使用coder.extrinsic构造

声明函数喷火作为外在的,在你的MATLAB代码中包含这个语句。

coder.extrinsic (“foo”

当声明函数为外部代码生成时,请遵循以下规则:

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

  • 不要在有条件陈述中使用外在声明。

  • 将外部函数的返回值赋给已知类型。看到使用mxArrays(MATLAB编码器)

有关其他信息和示例,请参见coder.extrinsic

代码生成器自动处理许多常见的MATLAB可视化函数,如情节disp,数字外在。您不必通过使用显式地将它们声明为外部函数coder.extrinsic.例如,您可能想要调用情节在Matlab环境中可视化您的结果。如果从调用的函数生成MEX函数情节,然后运行生成的MEX函数,则代码生成器将调用分派给情节函数到MATLAB引擎。如果生成库或可执行文件,则生成的代码不包含对情节函数。

如果您生成MEX或独立的C/ c++代码使用MATLAB编码器™,代码生成报告突出显示从MATLAB代码调用外部函数。通过检查报告,您可以确定哪些函数只在MATLAB环境中支持。金宝app

外部函数声明的作用域

coder.extrinsicConstruct具有功能范围。例如,考虑以下代码:

函数y = foo% # codegencoder.extrinsic (“老鼠”“最小值”);[N D] = rat(pi);y = 0;y = min(N, D);

在这个例子中,老鼠最小值每次在main函数中调用它们时,都被当作是外部的喷火.有两种方法可以缩小main函数内部外部声明的作用域:

  • 在局部函数中声明MATLAB函数的外部性质,如下面的例子:

    函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] = rat(pi);y = 0;y = mymin(N, D);函数Y =肌肉(A,B)编码器.Extrinsic(“最小值”);y = min (a, b);

    在这里,这个函数老鼠每次在main函数内部调用时都是外在的吗喷火,但函数最小值外部是否仅当调用内部局部函数mymin

  • 而不是使用coder.extrinsic构造,使用MATLAB函数调用Feval..下一节将描述这种方法。

非静态方法的外部声明

假设您定义了一个类myClass它有一个非静态方法喷火,然后创建实例obj这个类的。如果你想声明这个方法obj.foo.作为外部的MATLAB代码,你想要代码生成,遵循以下规则:

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

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

例如,定义myClass为:

classdefmyClass特性支持= 1结束方法函数Y = foo(obj,x)道具+ x;结束结束结束

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

函数y = myfunction(x)% # codegencoder.extrinsic (“foo”);obj = myClass;y = foo (obj, x);结束

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

额外的使用

使用coder.extrinsic构造:

  • 在模拟过程中调用不产生输出的MATLAB函数,而不产生不必要的代码。

  • 使您的代码具有自文档化并易于调试。您可以扫描源代码coder.extrinsic语句来隔离对MATLAB函数的调用,这可能会创建和传播mxArrays.看到使用mxArrays(MATLAB编码器)

调用MATLAB函数的使用Feval.

若要将外部声明的作用域缩小到仅一个函数调用,请使用函数Feval.Feval.在代码生成期间自动解释为外部函数。因此,您可以使用Feval.为了方便地调用要在MATLAB环境中执行的函数,而不是编译为生成的代码。

考虑以下例子:

函数Y = foo code .extrinsic(“老鼠”);[N D] = rat(pi);y = 0;y =函数宏指令(“最小值”、N、D);

因为Feval.是外在的,声明函数宏指令(“分钟”,N, D)是由MATLAB评估-未编译-有相同的结果,声明函数最小值外在这个电话。相比之下,功能老鼠整个功能都是外在的吗喷火

代码生成器不支持使用金宝appFeval.调用局部函数或位于私有文件夹中的函数。

使用mxArrays

外部函数的输出是mxarray.,也称为MATLAB数组。唯一有效的操作mxArrays是:

  • 存储一个mxarray.在一个变量中。

  • 传递一个mxarray.一个函数。

  • 返回一个mxarray.从函数返回到MATLAB。

  • 转换一个mxarray.到运行时已知的类型。要执行此操作,请将mxarray.赋值到一个类型已由先前赋值定义的变量。请参见下面的例子。

使用一个mxarray.在其他操作中由外部函数返回(例如,从MATLAB函数块到Simulin金宝appk执行),必须首先将其转换为已知类型。

如果函数的输入参数是mxArrays,代码生成器自动将函数视为外部函数。

将mxArrays转换为已知类型

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

例如,考虑以下代码:

函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] = rat(pi);y = min (N、D);

这里是顶层函数喷火调用外部MATLAB函数老鼠,返回2mxArrays代表分子N和分母D的有理分数近似PI..你可以传递这些mxArrays另一个MATLAB函数,在这个例子中,最小值.因为输入传递给最小值mxArrays,代码生成器自动处理最小值作为一个外在的功能。作为一个结果,最小值返回A.mxarray.

使用MATLAB编码器,你可以直接分配它mxarray.返回最小值到产出y因为MEX函数将其输出返回给MATLAB。

但是如果你把喷火在一个MATLAB函数块,然后更新或运行模型金宝app,你会得到这个错误:

功能输出'y'不能在此上下文中成为mxArray。考虑用已知类型以已知类型预先突出输出变量。

发生此错误是因为返回mxarray.不支持返回Sim金宝appulink。金宝app要解决这个问题,定义y是您期望的值的类型和大小最小值返回——在本例中是一个双精度标量——如下所示:

函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] = rat(pi);y = 0;%定义y作为双倍类型的标量y = min (N、D);

使用外部函数的限制

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

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

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

    • 改变文件夹

    • 改变MATLAB路径

    • 删除或添加MATLAB文件

    • 变化预警状态

    • 改变MATLAB偏好

    • 改变模型参数金宝app

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

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

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

另请参阅

|