MATLAB代码生成的类定义
为MATLAB生成高效的独立代码®类,您使用类时必须与在MATLAB环境中运行代码时不同。
有什么不同 | 更多的信息 |
---|---|
受限制的语言特性集。 | 语言的限制 |
有限的代码生成特性集。 | 代码生成特性与类不兼容 |
类属性的定义。 | 为代码生成定义类属性 |
句柄类的使用。 | |
调用基类构造函数。 | 调用基类构造函数 |
代码生成不支持包含MATLAB句柄对象的全局变量。金宝app | N/A |
不支持从内置MATLAB类继承。金宝app | 不支持从内置MATLAB类继承金宝app |
语言的限制
虽然为类的常见特性(如属性和方法)提供了代码生成支金宝app持,但仍有许多高级特性不受支持,例如:
事件
听众
对象数组
递归数据结构
链表
树
图
构造函数中的嵌套函数
Overloadable运营商
subsref
,subsassign
,subsindex
在MATLAB中,类可以定义它们自己的
subsref
,subsassign
,subsindex
方法。代码生成不支持对这些方法有自己定义的类。金宝app的
空
方法在MATLAB中,类有一个内置的静态方法,
空
,它将创建该类的空数组。代码生成不支持此方法。金宝app下面的MATLAB句柄类方法:
addlistener
情商
findobj
findpro
的
AbortSet
属性的属性
代码生成特性与类不兼容
可以为使用类的入口点MATLAB函数生成代码,但不能直接为MATLAB类生成代码。
例如,如果
ClassNameA
是类定义,不能通过执行以下命令生成代码:codegen ClassNameA
句柄类对象不能是入口点函数的输入或输出。
值类对象可以是入口点函数的输入或输出。但是,如果值类对象包含句柄类对象,则值类对象不能是入口点函数输入或输出。句柄类对象不能是入口点函数的输入或输出。
代码生成不支持处理类的全局变量。金宝app
代码生成不支持将值类的对象赋值给不可调属性。金宝app例如,
obj.prop = v;
在以下情况无效道具
是不可调属性和v
是基于值类的对象。你不能使用
coder.extrinsic
将一个类或方法声明为外部的。不能将MATLAB类传递给
coder.ceval
.您可以将类属性传递给coder.ceval
.如果属性具有get方法、set方法或验证器,或者是具有某些属性的System对象™属性,则不能通过引用将该属性传递给外部函数。看到某些属性不支持传递引用金宝app.
如果一个对象具有重复的属性名,而代码生成器试图不断折叠该对象,则代码生成可能会失败。与使用时,代码生成器常量将对象折叠
编码器。常数
或coder.const
,或者当它是一个常折叠外部函数的输入或输出时。在以下情况下,子类的对象中会出现重复的属性名:
子类有一个与父类的属性同名的属性。
子类派生于对属性使用相同名称的多个超类。
有关MATLAB何时允许重复属性名的信息,请参见子类化多个类.
为代码生成定义类属性
对于代码生成,必须定义与在MATLAB环境中运行代码时不同的类属性:
MEX函数报告由属性验证导致的错误。独立的C/ c++代码只有在启用运行时错误报告时才会报告这些错误。看到独立C/ c++代码中的运行时错误检测和报告.在生成独立的C/ c++代码之前,通过在整个输入值范围内运行MEX函数来测试属性验证是一种最佳实践。
定义属性后,不要为其分配不兼容的类型。在尝试增长属性之前,不要使用它。
在为代码生成定义类属性时,要考虑与定义变量时相同的因素。在MATLAB语言中,变量可以在运行时动态地改变它们的类、大小或复杂性,因此您可以使用相同的变量来保存不同的类、大小或复杂性的值。C和c++使用静态类型。在使用变量之前,为了确定它们的类型,代码生成器需要对每个变量进行完整的赋值。类似地,在使用属性之前,必须显式地定义它们的类、大小和复杂性。
初始值:
如果属性没有显式的初始值,代码生成器会假定它在构造函数的开头是未定义的。代码生成器不会将空矩阵赋值为默认值。
如果属性没有初始值,并且代码生成器无法确定该属性在第一次使用之前已被分配,则软件将生成编译错误。
对于System对象,如果不可调属性是结构,则必须完全分配该结构。不能使用下标进行部分赋值。
例如,对于一个不可调属性,你可以使用以下赋值:
mySystemObject.nonTunableProperty =结构(‘基坑’,‘‘,‘fieldB’,' b ');
不能使用以下部分赋值:
mySystemObject.nonTunableProperty.fieldA = 'a';mySystemObject.nonTunableProperty.fieldB = 'b';
coder.varsize
类属性不支持。金宝app如果属性的初始值是一个对象,那么属性必须是常量。属性要使属性为常量,请声明
常数
属性。例如:classdefMyClass属性(常量)p1 = MyClass2;结束结束
MATLAB在代码生成之前在类加载时计算类的初始值。如果在MATLAB类属性初始化中使用持久化变量,则类加载时计算的持久化变量值属于MATLAB;它不是代码生成时使用的值。如果你使用
coder.target
在MATLAB类属性初始化中,coder.target (MATLAB)
返回真正的(1)
.
适应可变属性:
代码生成支持值类和句柄类的上界和金宝app无界可变大小属性。
要生成无界的可变大小类属性,请启用动态内存分配。
若要创建大小可变的类属性,请对类属性进行两次连续赋值,一次赋值给标量,另一次赋值给数组。
classdefvarSizeProp1 <句柄属性道具varProp结束结束
函数extFunc(n) obj = varSizeProp1;为属性分配一个标量值。obj.prop= 1; obj.varProp = 1;将数组分配给相同的属性,使其大小可变。obj.prop= 1:98; obj.varProp = 1:n;结束
在前面的代码中,第一个赋值为
道具
和varProp
标量,它们的第二个赋值是赋给具有相同基类型的数组。的大小道具
的上限98
,使其成为一个上界的可变大小属性。如果
n
在编译时未知,obj.varProp
是一个无界的可变大小属性。如果它是已知的,则它是一个上界的、可变大小的类属性。如果类属性是用可变大小数组初始化的,则该属性为可变大小。
classdefvarSizeProp2属性道具结束方法函数obj = varSizeProp2(inVar)将传入值赋给局部变量locVar = inVar;声明局部变量为变量大小的列没有大小限制的%向量coder.varsize (“locVar”,[inf 1],[10 0]);赋值obj.prop= locVar;结束结束结束
在前面的代码中,
不胀钢
传递给类构造函数并存储在locVar
.locVar
被修改为可变大小的coder.varsize
并赋值给class属性obj.prop
,这使得属性大小可变。如果输入到函数调用
varSizeProp2
适应,coder.varsize
不是必需的。函数z = structcall (n) z = varSizeProp2(1:n);结束
如果值为
n
在编译时未知,没有指定的边界,z.prop
是一个无界的可变大小类属性。如果值为
n
在编译时未知,并有指定的边界,z.prop
是上界可变大小类属性。
如果属性为常量,且其值为对象,则不能更改该对象的属性值。例如,假设:
obj
是myClass1
.myClass1
具有常数性质p1
那是一个对象myClass2
.myClass2
有一个属性p2
.
代码生成不支持以下代码:金宝app
obj.p1。P2 = 1;
调用基类构造函数
如果类构造函数包含对基类构造函数的调用,则对基类构造函数的调用必须在前面为
,如果
,返回
,开关
或而
语句。
例如,如果定义一个类B
基于类一个
:
classdef B < A方法obj = B(varargin)如果nargin = 0 A = 1;B = 2;Elseif nargin == 1 a = varargin{1};B = 1;Elseif nargin == 2 a = varargin{1};B = varargin{2};end obj = obj@A(a,b);结束结束
因为类定义为B
使用一个如果
的基类构造函数一个
,则不能为函数生成代码callB
:
function [y1,y2] = callB x = B;Y1 = x.p1;Y2 = x.p2;结束
但是,您可以为callB
如果你定义类B
为:
classdef B < A方法函数obj = NewB(varargin) [A, B] = getaandb(varargin{:});obj = obj@A(a,b);函数[a,b] = getaandb(varargin) if nargin == 0 a = 1;B = 2;Elseif nargin == 1 a = varargin{1};B = 1;Elseif nargin == 2 a = varargin{1};B = varargin{2};结束结束
从内置继承MATLAB不支持的类金宝app
不能为从内置MATLAB类继承的类生成代码。例如,您不能为以下类生成代码:
classdefMyclass < double