主要内容

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

在处理对函数的调用时Foo在你的matlab中®代码,代码生成器查找定义Foo并为其身体生成代码。在某些情况下,您可能希望绕过代码生成,然后使用MATLAB引擎执行呼叫。使用coder.extrinsic(“foo”)宣布调用Foo不要生成代码,而是使用MATLAB引擎执行。在这种情况下,Foo被称为外在功能。仅当Matlab引擎在执行期间可用时,此功能才可用。这种情况的示例包括执行MEX函数,Simulink金宝app®模拟,或代码生成时的函数调用(也称为编译时间).

如果你为一个调用Foo并包括coder.extrinsic(“foo”),代码生成器尝试确定是否Foo影响输出。如果Foo不影响输出,代码生成器与代码生成进行,但排除Foo来自生成的代码。否则,代码生成器会产生编译错误。

包括coder.extrinsic(“foo”)在某个MATLAB功能内指令声明所有呼叫Foo在那个Matlab函数的内在内在。或者,您可能希望将外在声明的范围缩小到一个呼叫Foo.看使用feval调用matlab函数

何时将功能声明为外在

下面是一些常见的情况,你可能会考虑将MATLAB函数声明为外部的:

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

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

  • 您指示代码生成器通过使用持续折叠函数调用Coder.Const..在这种情况下,当Matlab引擎可用于执行呼叫时,函数仅在代码生成中调用。

使用编码器.Extrinsic.构造

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

coder.extrinsic ('foo'

在声明作为代码生成外在的功能时,遵守这些规则:

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

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

  • 将外部函数的返回值赋给已知类型。看使用mxarrays

有关其他信息和示例,请参阅编码器.Extrinsic.

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

如果使用MEX或Standalone C / C ++代码Matlab Coder™,代码生成报告将来自MATLAB代码的呼叫突出显示到外部函数。通过检查报告,您可以确定仅在MATLAB环境中支持哪些函数。金宝app

外部函数声明的作用域

编码器.Extrinsic.结构具有功能范围。例如,考虑以下代码:

函数y = foo%#codegen.coder.extrinsic (“老鼠”'min');[N D] =大鼠(pi);y = 0;y = min(N, D);

在这个例子中,大鼠每次在main函数中调用它们时,都被视为外部的Foo.有两种方法可以在主要功能内缩小外在声明的范围:

  • 在本地功能中声明matlab函数外在,如本例所示:

    函数y = foo%#codegen.coder.extrinsic (“老鼠”);[N D] =大鼠(pi);y = 0;y =肌肉(n,d);函数Y =肌肉(A,B)编码器.Extrinsic('min');y = min (a, b);

    这里,功能大鼠每次在主函数内部调用它都是外在的吗Foo,但功能只有在局部函数内部调用时才是外在的吗mymin

  • 而不是使用编码器.Extrinsic.构造,使用matlab函数使用Feval..该方法在下一节中描述。

非静态方法的外部声明

假设您定义了一个类myClass它有一个非静态方法Foo,然后创建一个实例obj这个课程。如果要声明该方法obj.foo.如果你想在MATLAB代码中生成代码,请遵循以下规则:

  • 写下电话Foo作为函数调用。不要使用点符号来编写调用。

  • 宣布Foo通过使用语法变得外在coder.extrinsic(“foo”)

例如,定义myClass如:

Classdef.myClass属性prop = 1结束方法函数y = foo(obj,x)y = obj.prop + x;结束结束结束

下面是一个MATLAB函数的例子,它声明Foo外在。

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

非静态方法也称为常规方法。看定义类方法和功能

额外用途

用来编码器.Extrinsic.构建:

  • 在仿真过程中调用不产生输出的MATLAB函数,不生成不必要的代码。

  • 使您的代码自我记录,更易于调试。您可以扫描源代码编码器.Extrinsic.语句来隔离对MATLAB函数的调用,它可能会创建和传播mxArrays.看使用mxarrays

调用MATLAB功能使用Feval.

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

考虑下面的例子:

函数y = foo编码器.Extrinsic(“老鼠”);[N D] =大鼠(pi);y = 0;y = feval('min',n,d);

因为Feval.是外在的,声明函数宏指令(“分钟”,N, D)由matlab评估 - 未编译 - 与声明该功能相同的结果外在这个电话。相比之下,功能大鼠在整个功能中是外在的Foo

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

使用mxarrays

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

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

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

  • 返回A.mxarray.从函数返回到MATLAB。

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

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

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

将mxArrays转换为已知类型

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

例如,考虑此代码:

函数y = foo%#codegen.coder.extrinsic (“老鼠”);[N D] =大鼠(pi);y = min(n,d);

这里是顶级函数Foo调用外部MATLAB函数大鼠返回两个mxArrays代表分子N.和分母D.的有理分数近似PI..你可以通过这些mxArrays转到另一个MATLAB函数,在这个例子中,.因为输入传递给mxArrays,代码生成器会自动处理作为外在功能。结果,返回A.mxarray.

通过使用产生MEX功能的同时Matlab编码器,您可以直接分配此mxarray.返回到产出y因为MEX函数将其输出返回到MATLAB。

但如果你放了Foo在A.MATLAB函数块在Simulink模金宝app型中,然后更新或运行模型,您将获得此错误:

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

出现此错误是因为返回一个mxarray.返回Simuli金宝appnk不受支持。金宝app解决此问题,定义y成为您期望的价值的类型和大小返回——在本例中是标量双精度——如下所示:

函数y = foo%#codegen.coder.extrinsic (“老鼠”);[N D] =大鼠(pi);y = 0;%定义y作为双倍类型的标量y = min(n,d);

使用外部函数的限制

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

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

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

    • 改变文件夹

    • 改变MATLAB路径

    • 删除或添加MATLAB文件

    • 变化预警状态

    • 改变MATLAB偏好

    • 改变模型参数金宝app

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

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

  • 您可以调用最多64个输入和64个输出的外在功能。

另请参阅

|