主要内容

马铃薯代码生成的类定义

为MATLAB生成高效的独立代码®类,您必须使用不同的类而不是在Matlab环境中运行代码时的类。

什么是不同的 更多的信息
受限制的语言功能集。 语言限制
限制组代码生成功能。 代码生成特性与类不兼容
类属性的定义。 定义代码生成的类属性
使用句柄类。

为MATLAB处理类和系统对象生成代码

句柄类析构函数的代码生成

处理代码生成的对象限制

代码生成不支持包含MATLAB句柄对象的全局变量。金宝app N/A
不支持从内置MATLAB类的继承。金宝app 不支持从内置MATLAB类继承金宝app

语言限制

虽然提供了代码生成支持类的公共特性,如属性和方法,金宝app但有一些高级特性不受支持,如:

  • 活动

  • 听众

  • 对象的数组

  • 递归数据结构

    • 链接清单

  • 构造函数中的嵌套函数

  • 可重载的运营商子反馈subsassign., 和subsindex.

    在MATLAB中,类可以定义自己版本的子反馈subsassign., 和subsindex.方法。代码生成不支持具有这些方法的自己定义的类。金宝app

  • 方法

    在Matlab中,类具有内置静态方法,,它创建了一个空的班级数组。代码生成不支持此方法。金宝app

  • 下面的MATLAB句柄类方法:

    • addlistener

    • 情商

    • findobj.

    • findpro.

  • 埋葬属性属性

代码生成特性与类不兼容

  • 您可以生成用于使用类的入口点MATLAB函数的代码,但您无法直接为MATLAB类生成代码。

    例如,如果ClassNameA是类定义,不能通过执行以下命令生成代码:

    codegen ClassNameA

  • 句柄类对象不能是入口点函数的输入或输出。

  • 值类对象可以是入口点函数的输入或输出。但是,如果值类对象包含句柄类对象,则值类对象不能作为入口点函数输入或输出。句柄类对象不能是入口点函数的输入或输出。

  • 代码生成不支持句柄类的全局变量。金宝app

  • 代码生成不支持将值类的对象分配到不可调优属性。金宝app例如,obj.prop = v;无效的时间无效支柱是一个不禁止的财产和v是基于值类的对象。

  • 你不能使用coder.extrinsic将类别或方法声明为外在。

  • 你不能通过matlab课程编码器.CEVAL..您可以将类属性传递给编码器.CEVAL.

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的System对象™属性,则不能通过引用将属性传递给外部函数。看到某些属性不支持通过引用传递金宝app

  • 如果对象具有重复的属性名称,并且代码生成器尝试持续折叠对象,则代码生成可能会失败。代码生成器在使用时常用 - 折叠对象编码器.Constant.或者Coder.Const.,或者当它是常数折叠的外部函数的输入或输出时。

    在以下情况下,子类的对象中会出现重复的属性名:

    • 子类有一个与超类的属性同名的属性。

    • 子类派生自多个对属性使用相同名称的超类。

    有关MATLAB允许重复属性名称的信息,请参阅子类化多个类

定义代码生成的类属性

对于代码生成,您必须在在MATLAB环境中运行代码时的不同方式定义类属性:

  • MEX函数报告属性验证结果的错误。独立的C / C ++代码仅在启用运行时错误报告时才会报告这些错误。看到生成检测和报告运行时错误的独立C/ c++代码.在生成独立的C / C ++代码之前,它是通过在全范围内运行MEX功能来测试属性验证的最佳实践。

  • 定义属性后,请勿将其分配不兼容的类型。在尝试成长之前,请勿使用属性。

    定义代码生成的类属性时,请考虑在定义变量时考虑的相同因素。在Matlab语言中,变量可以在运行时动态地改变其类,大小或复杂性,因此您可以使用相同的变量来保存不同类,大小或复杂性的值。C和C ++使用静态键入。在使用变量之前,要确定其类型,则代码生成器需要对每个变量的完整分配。同样,在使用属性之前,必须明确定义其类,大小和复杂性。

  • 初始值:

    • 如果该属性没有显式的初始值,则代码生成器会假定该属性在构造函数的开始处为未定义。代码生成器不会将空矩阵作为默认值。

    • 如果属性没有初始值,并且代码生成器无法确定在首次使用之前分配了该属性,则该软件会生成编译错误。

    • 对于系统对象,如果不可运送属性是一个结构,则必须完全分配结构。您无法使用订户进行部分分配。

      例如,对于不可调优属性,可以使用以下赋值:

      mysystemobject.nontunableProperty = struct('fielda','a','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 <处理特性Prop 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;%将本地变量声明为变量大小列%矢量没有尺寸限制编码器.Varsize(“locVar”[正1],[1 0]);%分配值obj.prop.= locVar;结尾结尾结尾

      在前面的代码中,不胀钢传递给类构造函数并存储在Locvar.Locvar.被修改为可变大小coder.varsize并分配给Class属性obj.prop.,这使得属性变量为size。

      • 如果是函数调用的输入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;

从内置的继承马铃薯类不支持金宝app

您无法生成从内置MATLAB类继承的类的代码。例如,您无法为以下类生成代码:

classdefmyclass <双