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