主要内容

代码生成的时间表限制

如果您在用于代码生成的 MATLAB® 代码中创建时间表、修改时间表或使用时间表函数,则代码生成存在下列各节中描述的限制。适用于类的限制也适用于时间表。有关类限制的详细信息,请参阅用于代码生成的 MATLAB 类定义 (MATLAB Coder)

创建时间表时的限制

如果您的 MATLAB 代码创建了时间表,则代码生成存在以下限制。

时间表创建的输入

限制

任何输入

  • 时间表的第一个维度的名称为 'Time',除非您使用 'DimensionNames' 名称-值参量指定它。

    第一个维度的名称也是行时间向量的名称,您可以使用圆点表示法来引用它。

  • 要在入口函数传入 'SampleRate''StartTime''TimeStep' 名称-值参量时创建一个规则时间表,请先使用 coder.Constant 函数将这些值设为常量。如果不将它们设为常量,则行时间被视为不规则。

  • 如果您创建规则时间表,并尝试设置不规则的行时间,则会生成错误。

  • 如果您创建不规则时间表,则即使您设置其采样率或时间步,它仍是不规则的。

  • 时间表变量名称不必是有效的 MATLAB 标识符。名称必须由 ASCII 字符组成,可以包括逗号、破折号和空白字符。

从输入数组创建的时间表

  • 通过使用 timetablearray2timetable 函数基于输入数组创建时间表时,必须使用 'VariableNames' 名称-值参量指定变量名称。

使用预分配变量创建的时间表

  • 当使用 timetable 函数和 'Size' 名称-值参量预分配时间表时,不必指定 'VariableNames' 参量。

  • 使用 'VariableTypes' 名称-值参量只能指定以下数据类型:

    • 'double'

    • 'single'

    • 'doublenan''doubleNaN'

    • 'singlenan''singleNaN'

    • 'int8''int16''int32''int64'

    • 'uint8''uint16''uint32''uint64'

    • 'logical'

    • 'datetime'

    • 'duration'

    • 'cellstr'

    • 'char'

修改时间表限制

如果您的 MATLAB 代码修改了时间表中的数据、其行时间或属性,则代码生成存在以下限制。

时间表操作或属性

限制

VariableNamesDimensionNamesUserData 属性

  • 创建时间表后,您无法更改 VariableNamesDimensionNamesUserData 属性。

    创建时间表时,您可以指定 'VariableNames''DimensionNames''RowTimes' 输入参量来设置具有这些名称的属性。

VariableTypes 属性

  • 创建时间表后,您无法访问 VariableTypes 属性。

  • 当您在创建时间表的过程中预分配时间表时,您可以指定 'VariableTypes' 输入参量。

时间表索引作为生成代码的输入参量

  • 要将指定变量的时间表索引作为输入参量传递到生成的代码中,请先使用 coder.Constant 函数将时间表的第二个维度的索引设为常量。如果第二个维度的索引不是常量,则对变量进行索引会生成错误。

  • 如果时间表的行时间为 duration 值,并且您使用 duration 值或由 timerangewithtol 函数生成的对象对其进行索引,则输出为非常量且行数可变。

  • 如果规则时间表的行时间为 duration 值,并且您使用 duration 值或由 timerangewithtol 函数生成的对象对其进行索引,则输出被视为不规则。

自定义元数据

  • 您无法将自定义元数据添加到时间表中。不支持 addproprmprop 函数。

更改时间表大小的赋值

  • 您无法通过赋值来更改时间表的大小。例如,以下用于添加新行的调用会生成错误。

    function TT = foo() %#codegen
        TT = timetable((1:3)',(1:3)',...
        'RowTimes',seconds([0,5,10]),...
        'VariableNames',{'Var1','Var2'});
        TT{4,:} = [5,5];
    end
    

    通过赋值删除行或变量也会生成错误。

  • 您无法通过在赋值中使用新行时间来添加新行。例如,以下调用通过使用新行时间(而不是数值索引)来添加新行,该调用不会生成错误,但也不会添加新行。

    function TT = foo() %#codegen
        TT = timetable((1:3)',(1:3)',...
        'RowTimes',seconds([0,5,10]),...
        'VariableNames',{'Var1','Var2'});
        TT{seconds(15),:} = [5,5];
    end
    

垂直串联

  • 当您垂直串联时间表时,它们必须具有相同的变量名称,其顺序也必须相同。在 MATLAB 中,变量名称必须相同,但在时间表中的顺序可以不同。

水平串联

  • 当您水平串联时间表时,它们必须具有相同的行时间,其顺序也必须相同。在 MATLAB 中,行时间必须相同,但在时间表中的顺序可以不同。

作为 N 维元胞数组的时间表变量

  • 如果两个时间表的变量是 N 维元胞数组,则您无法垂直串联这两个时间表。

  • 您无法使用花括号从 N 维元胞数组组成的多个时间表变量中提取数据,因为此操作是水平串联。

使用时间表函数限制

如果您的 MATLAB 代码使用下表中列出的函数,则代码生成存在以下限制。

函数

限制

convertvars

  • 不支持函数句柄。

  • 第二个和第三个输入参量(varsdataType)必须为常量。

  • 您无法将 dataType 指定为 'cell''cellstr''char'

innerjoin

  • 通常,输入时间表不能有任何同名的非键变量。但是,如果指定 'LeftVariables''RightVariables' 名称-值参量,则可以联接输入时间表的子集。请指定这些参量,以便 'LeftVariables''RightVariables' 中不会出现变量名称。

  • 以下名称-值参量的值必须为常量:

    • 'Keys'

    • 'LeftKeys'

    • 'RightKeys'

    • 'LeftVariables'

    • 'RightVariables'

  • 不支持嵌套时间表。

intersect

setdiff

setxor

union

  • 这些函数在所有情况下都支持未排序的时间表。您不必指定 'stable' 选项。

isregular

  • 使用 coder.Constant 将输入参量 timeComponent 设为常量。

  • 输入参量 timeComponent 不能为日历单位。如果您指定它,则其值必须为 'time'

issortedrows

  • 输入参量 vars 必须为常量。

  • 如果任何时间表变量有多列,则这些变量必须具有固定宽度。

join

  • 通常,输入时间表不能有同名的非键变量。但是,如果指定名称-值参量,则可以联接输入时间表的子集:

    • 'KeepOneCopy',仅列出要从左侧输入时间表中获取的变量。

    • 'LeftVariables''RightVariables',列出要从左侧输入时间表或右侧输入时间表(但不能同时包含两者)中获取的变量。

  • 以下名称-值参量的值必须为常量:

    • 'Keys'

    • 'LeftKeys'

    • 'RightKeys'

    • 'LeftVariables'

    • 'RightVariables'

    • 'KeepOneCopy'

  • 不支持嵌套时间表。

movevars

  • 输入参量 vars 不能包含重复的变量名称。

outerjoin

  • 除非 'MergeKeys' 的值为 true(逻辑值 1),否则输入时间表不能有同名的键变量。

  • 通常,输入时间表不能有任何同名的非键变量。但是,如果指定 'LeftVariables''RightVariables' 名称-值参量,则可以联接输入时间表的子集。请指定这些参量,以便 'LeftVariables''RightVariables' 中不会出现变量名称。

  • 以下名称-值参量的值必须为常量:

    • 'Keys'

    • 'LeftKeys'

    • 'RightKeys'

    • 'MergeKeys'

    • 'LeftVariables'

    • 'RightVariables'

    • 'Type'

  • 不支持嵌套时间表。

retime

synchronize

  • 输出时间表的行时间被认为是不规则的,即使与具有规则时间步的行时间同步也是如此。

  • 不支持 'makima' 插值方法。

  • 如果输入时间表的 VariableContinuity 属性不是常量,则此函数会忽略它们。

  • 不支持 'weekly''monthly''quarterly' 时间步。

    • 如果输入时间表的行时间为 datetime 值,则也不支持 'daily''yearly' 时间步。

sortrows

  • 输入参量 vars 必须为常量。

  • 如果 tblA 有一个变量是包含多列的字符向量元胞数组,则无法使用该变量中的值对时间表进行排序。

splitvars

  • 'NewVariableNames' 名称-值参量的值必须为常量。

  • 拆分的变量不能有可变的列数。

stack

  • 第二个输入参量 vars 必须为常量。

  • 'ConstantVariables''NewDataVariableName''IndexVariableName' 名称-值参量的值必须为常量。

timerange

  • 不支持输入参量 datetimeUnit

  • 不支持事件过滤器。

unstack

  • 必须指定 'NewDataVariableNames' 名称-值参量。其值必须为常量。

  • varsivars 输入参量(数据变量和指示变量)必须为常量。

  • 如果指定分组变量和常变量,则它们必须为常量。

  • 如果指定聚合函数,则它必须为常量。

  • 如果输入是具有规则行时间的时间表,并且您指定不包括行时间的分组变量,则输出时间表可能具有不规则行时间。尽管输出行时间之间的间隔可能看起来相同,但输出时间表认为行时间的向量是不规则的。

  • 如果输入时间表的一个变量是字符向量元胞数组,则 unstack 在生成的代码中用 1×0 字符数组填充对应输出变量中的空单元格。在 MATLAB 中,unstack 用 0×0 字符数组来填充这些空缺。

  • 当输入时间表中有一个变量是异构元胞数组且它无法转换为同构元胞数组时,unstack 函数不支持代码生成。

    • 如果输入有一个变量是同构元胞数组或可以转换为同构元胞数组,则必须指定 'AggregationFunction' 名称-值参量。'AggregationFunction' 的默认值为 'unique'。但是,unique 函数不支持元胞数组。

varfun

  • 函数句柄输入 func 必须为常量。

  • 虽然函数句柄可以是 varfun 本身的输入,但它们不能是您的入口函数的输入。请在用于代码生成的代码中指定 func。有关详细信息,请参阅代码生成的函数句柄限制 (MATLAB Coder)

  • 所有名称-值参量的值都必须为常量。

  • 代码生成不支持 'ErrorHandler' 名称-值参量。

  • 不支持可变大小的输入参量。

  • 如果指定 'GroupingVariables',则输出始终是不规则的时间表。

  • 在生成的代码中,分组变量不能有重复值。

  • 如果指定 'OutputFormat' 名称-值参量,并且函数为 'cell' 指定的每个变量返回不同的数据类型,则不能将 'GroupingVariables' 的值指定为 'InputVariables'

  • 如果您指定组但在编译时组的数量未知,并且后来发现该数量为零,则输出中的空双精度变量在生成的代码中的大小可能为 1×0。在 MATLAB 中,此类变量的大小为 0×0。

withtol

  • 不支持事件过滤器。

另请参阅

| |

主题