在处理对函数的调用时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.
Feval.
要将外部声明的范围缩小到只需一个函数调用,请使用功能Feval.
.Feval.
在代码生成期间自动解释为一个外部函数。因此,可以使用Feval.
为了方便地调用要在MATLAB环境中执行的函数,而不是编译为生成的代码。
考虑下面的例子:
函数y = foo编码器.Extrinsic(“老鼠”);[N D] =大鼠(pi);y = 0;y = feval('min',n,d);
因为Feval.
是外在的,声明函数宏指令(“分钟”,N, D)
由matlab评估 - 未编译 - 与声明该功能相同的结果闵
外在这个电话。相比之下,功能大鼠
在整个功能中是外在的Foo
.
代码生成器不支持使用金宝appFeval.
调用本地函数或位于私有文件夹中的函数。
一个外部函数的输出是mxarray.
,也称为MATLAB数组。唯一有效的操作mxArrays
是:
存储一个mxarray.
在一个变量中。
传递一个mxarray.
到一个函数。
返回A.mxarray.
从函数返回到MATLAB。
转换一个mxarray.
在运行时的已知类型。要执行此操作,请分配mxarray.
指向其类型已由先前赋值定义的变量。请参见下面的例子。
使用A.mxarray.
在其他操作中由外部函数返回(例如,从a中返回它MATLAB函数块到Simulin金宝appk执行),您必须首先将其转换为已知类型。
如果函数的输入参数是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函数有以下限制: