Main Content

Interpolation Using Prelookup

使用预先计算的索引和区间比值快速逼近 N 维函数。

  • Interpolation Using Prelookup block

库:
Simulink / Lookup Tables

描述

当与 Prelookup 模块结合使用时,Interpolation Using Prelookup 模块的效率最高。Prelookup 模块计算索引和区间比,这些数据说明输入值 u 与断点数据集的相对关系。将生成的索引和区间比值馈送给 Interpolation Using Prelookup 模块,以便对 n 维表进行插值。这两个模块采用分布式算法。当二者结合使用时,执行的运算与 n-D Lookup Table 模块中的积分算法相同。但是,Prelookup 和 Interpolation Using Prelookup 模块提供了更大的灵活性,可更高效地进行仿真和代码生成。有关详细信息,请参阅执行效率

支持的模块运算

要使用 Interpolation Using Prelookup 模块,您可以直接在对话框中指定一组表数据值,或将值馈送到 T 输入端口中。通常,这些表值对应于在 Prelookup 模块中指定的断点数据集。Interpolation Using Prelookup 模块基于 Prelookup 模块馈送的索引和区间比值查找或估计表值,进而生成输出。索引和区间比的标签在 Interpolation Using Prelookup 模块图标上显示为 kf

当索引和区间比的输入属于以下情况时...Interpolation Using Prelookup 模块...
映射到断点数据集中的值输出位于行、列和更高维度断点的交点处的表值
不映射到断点数据集中的值,但在范围内使用您选择的内插方法内插适当的表值
不映射到断点数据集中的值,并且超出范围使用您选择的外插方法外插以获得输出值

模块如何对表数据的子集进行插值

您可以使用子表选择维数参数指定插值只发生在表数据的子集上。要激活此插值模式,请将此参数设置为正整数。该值定义用于进行子表选择的维数,对于默认的列优先算法,该值从表数据的最高维度起计。因此,该值必须小于或等于表维数

对于行优先算法,插值从表数据的第一个维度或最低维度开始。

当您选择数学和数据类型 > 使用针对行优先数组布局优化的算法配置参数时,对于非零值,行优先布局中的子表选择行为会有所优化。

假设您的 Interpolation Using Prelookup 模块中有三维表数据。以下行为适用于列优先算法。

所选维度的数量模块的动作模块外观
0对整个表进行插值,并且不激活子表选择不更改
1对前两个维度进行插值,并选择第三个维度 显示标签为 s3 的输入端口,用于选择二维表,然后对其插值
2对第一个维度进行插值,并选择第二个维度和第三个维度 显示标签为 s2s3 的两个输入端口,用于选择一维表,然后对其插值

子表选择使用从 0 开始的索引。有关对表数据子集进行插值的示例,请参阅 Using the Prelookup and Interpolation Blocks

对于没有子表选择的二维或 n 维插值,列优先算法和行优先算法在输出计算的顺序上可能有所不同,导致数值结果略有不同。

示例

全部展开

此示例说明如何将断点数据集从 Constant 模块提供给 Prelookup 模块的 bp 输入端口。

Prelookup 模块从 bp 输入端口继承以下断点属性:

  • 最小值Inf

  • 最大值Inf

  • 数据类型single

同样,Constant 模块将表数据值提供给 Interpolation Using Prelookup 模块的 T 输入端口,该模块继承以下属性:

  • 最小值Inf

  • 最大值Inf

  • 数据类型single

Simulink® 使用双精度浮点数据来执行此模型中的计算。但是,该模型将断点和表数据存储为单精度浮点数据。使用较低精度的数据类型存储断点和表数据可减少内存要求。

此示例说明如何在 Prelookup 模块中指定均匀分布的断点数据。

断点数据部分中,设定参数设置为 Even spacing。参数第一个点间距点数分别设置为 25124。指定这些参数会创建四个等间距断点:[25, 37, 49, 61]

指定等间距断点的另一种方法是将设定设置为 Explicit values,并将设置为 [25:12:61]

Simulink® 使用双精度浮点数据来执行此模型中的计算。但是,该模型将断点和表数据存储为双精度值。

此示例说明如何从 Prelookup 模块输出包含索引 (k) 和区间比 (f) 的总线。然后,总线对象可以用做 Interpolation Using Prelookup 模块的输入。该示例还显示如何在不使用总线对象的情况下获得相同的结果。

打开并仿真模型。

在模型顶部,打开 Prelookup 模块的对话框。在常设选项卡中,请注意输出选择设置为 Index and fraction as bus。在数据类型选项卡中,请注意输出设置为 Bus: myBus。在 Simulink® 编辑器中,选择建模>模型设置>模型属性并打开回调选项卡。在模型的 PreLoadFcn 中,代码定义总线对象 myBus,该对象将索引指定为第一个总线元素,将区间比指定为第二个元素。

打开 Interpolation Using Prelookup 模块的对话框。在选项卡中,请注意已选中需要以总线输出的索引和区间比复选框。该选项将模块配置为使用 Prelookup 模块的总线输出。

端口

输入

全部展开

从 0 开始的索引 k,指定包含输入 u 的区间,用于表的第一个维度。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

区间比 f,表示输入在区间 k 内的归一化位置,用于表的第一个维度。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

从 0 开始的索引 k,为表的第 n 个维度指定包含输入 u 的区间。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

区间比 f,表示输入在区间 k 内的归一化位置,用于表的第 n 个维度。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

kf1 端口的输入,包含索引 k 和区间比 f,指定为总线对象。

依存关系

要启用此端口,请选中需要以总线输出的索引和区间比复选框。

可用的 kf 输入端口的数量取决于维数子表选择维数参数的值。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point | bus

kfn 端口的输入,包含输入的第 n 维的索引 k 和区间比 f,指定为总线对象。

依存关系

要启用此端口,请选中需要以总线输出的索引和区间比复选框。

可用的 kf 输入端口的数量取决于维数子表选择维数参数的值。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point | bus

对于列优先算法,模块使用 sm、sm+1、...、sn 端口的输入来执行子表选择和插值。m 映射到表的第 m 个维度。n 等于维数

对于行优先算法,模块使用 s1、s2、...、sm 端口的输入来执行子表选择和插值。m 映射到表的第 m 个维度。m 等于子表选择维数

依存关系

要启用此端口,子表选择维数必须为小于或等于维数的正整数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

表数据值作为端口 T 的输入提供。通常,这些表值对应于在 Prelookup 模块中指定的断点数据集。Interpolation Using Prelookup 模块基于从 Prelookup 模块馈送的索引 (k) 和区间比 (f) 值查找或估计表值,进而生成输出。

依存关系

要启用此端口,请将设置为输入端口

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

输出

全部展开

N 维函数的逼近,通过使用来自输入索引 k 和区间比 f 的值内插(或外插)表数据而计算得出。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

参数

全部展开

常设

表数据

指定表数据必须具有的维数。维数定义该表的自变量的数目。

要指定...执行此操作...

1、2、3 或 4

从下拉列表中选择值。

更高的表维数

直接在字段中输入正整数。

此模块支持的最大表维数为 30。

编程用法

模块参数NumberOfTableDimensions
类型:字符向量
值:'1' | '2' | '3' |'4' | ... | '30'
默认值:'2'

选中此复选框可在一个总线中合并索引和区间比输入。

要使 Prelookup 模块能够向 Interpolation Using Prelookup 模块提供输入,请进行如下设置:

  • 输出选择设置为索引和区间比作为总线

  • 输出设置为 Bus: <object name>,其中 <object name> 必须为模型可访问的有效总线对象名称

无论此复选框设置如何,选择端口始终以非总线模式运行。

编程用法

模块参数RequireIndexFractionAsBus
类型:字符向量
值:'off' | 'on'
默认值:'off'

指定是直接输入表数据还是使用查找表对象。如果将此参数设置为:

  • 显式值,则参数在对话框中可见。

  • 查找表对象,则名称参数在对话框中可见。

编程用法

模块参数TableSpecification
类型:字符向量
值:'Explicit values' | 'Lookup table object'
默认值:'Explicit values'

指定是在对话框中输入表数据,还是从输入端口继承数据。如果将设置为:

  • 对话框,则在下的文本框中输入表数据

  • 输入端口,则验证上游信号向表输入端口提供表数据

依存关系

要启用此参数,请将设定设置为显式值

编程用法

模块参数TableSource
类型:字符向量
值:'Dialog' | 'Input port'
默认值:'Dialog'

将表数据指定为 N 维数组,其中 N维数参数的值。编辑模块图时,您可以在编辑字段中输入空矩阵 ([]) 或未定义的工作区变量,而无需指定正确维度的矩阵。有关如何在 MATLAB® 中构造多维数组的信息,请参阅 多维数组

如果您将设置为输入端口,请验证上游信号是否向 T 输入端口提供表数据。表数据的大小必须与表维数相匹配。对于此选项,模块从 T 输入端口继承表属性。

要使用查找表编辑器编辑查找表,请点击编辑(请参阅 Edit Lookup Tables)。

依存关系

要启用此参数并在对话框中显式指定表值,您必须将设定设置为显式值并将设置为对话框

编程用法

模块参数Table
类型:字符向量
值:scalar, vector, matrix, or N-D array
默认值'sqrt([1:11]' * [1:11])'

指定 Simulink.LookupTable 对象的名称。查找表对象引用 Simulink® 断点对象。如果 Simulink.LookupTable 对象不存在,请点击操作按钮 并选择创建。新查找表对象的对应参数会自动用模块信息填充。

依存关系

要启用此参数,请将设定设置为查找表对象

编程用法

模块参数LookupTableObject
类型:字符向量
值:Simulink.LookupTable object
默认值:''
算法

指定模块对表数据进行插值的方法。您可以选择 Linear point-slopeFlatNearestLinear Lagrange。有关详细信息,请参阅内插方法

编程用法

模块参数InterpMethod
类型:字符向量
值:'Flat' | 'Linear point-slope' | 'Nearest' | 'Linear Lagrange'
默认值:'Linear point-slope'

指定模块对断点数据集范围之外的所有输入进行外插的方法。您可以选择裁剪线性。有关详细信息,请参阅外插方法

如果外插方法是线性,则基于所选择的线性插值方法计算外插值。例如,如果插值方法是线性拉格朗日,则外插方法继承线性拉格朗日方程以计算外插值。

要使用 PrelookupInterpolation Using Prelookup 模块来复制 n-D Lookup Table 模块行为,用于 PrelookupInterpolation Using Prelookup 模块的外插方法必须与仅使用 n-D Lookup Table 模块时相同。例如,要获得与外插方法设置为线性n-D Lookup Table 模块相同的行为,请将 PrelookupInterpolation Using Prelookup 模块的外插方法设置为线性

依存关系

要启用外插方法参数,请将内插方法设置为线性

当输入或输出信号指定整数或定点数据类型时,Interpolation Using Prelookup 模块不支持线性外插。

编程用法

模块参数ExtrapMethod
类型:字符向量
值:'Clip' | 'Linear'
默认值:'Linear'

指定具有索引 (k) 和区间比 (f) 的模块输入如何访问 n 维表数据最后的元素。索引值从 0 开始。

当输入索引等于或大于该维度的表的最后一个索引时,此复选框才有意义。由于舍入,选中和清除此复选框可能会导致仿真和代码生成之间最后一个索引的结果不同。

复选框模块行为

on

当出现以下情况时,返回表维度中最后一个元素的值:

  • k 是对应维度中最后一个表元素的索引

  • f0

off

当出现以下情况时,返回表维度中最后一个元素的值:

  • k 是对应维度中倒数第二个表元素的索引

  • f1

依存关系

仅在以下情况下,此复选框才可见:

  • 内插方法线性点-斜率线性拉格朗日

  • 外插方法裁剪

提示

当您为 Interpolation Using Prelookup 模块选择有效的索引输入可到达最后一个索引时,您还必须为向此模块馈送数据的所有 Prelookup 模块选择将最后一个断点用于等于或高于上限的输入。此操作允许模块在访问其断点和表数据集的最后一个元素时使用相同的索引约定。

编程用法

模块参数ValidIndexMayReachLast
类型:字符向量
值:'off' | 'on'
默认值:'off'

指定当输入超出范围时,是否生成警告或错误消息。选项包括:

  • - 不产生任何响应。

  • 警告 - 显示警告并继续进行仿真。

  • 错误 - 终止仿真并显示错误。

编程用法

模块参数DiagnosticForOutOfRangeInput
类型:字符向量
值:'None' | 'Warning' | 'Error'
默认值:'None'

指定模块用于计算输出的子表的维数。请遵循以下规则:

  • 要启用子表选择,请输入正整数。

    该整数必须小于或等于表维数

  • 要禁用子表选择,请输入 0 以对整个表进行插值。

当您选择数学和数据类型 > 使用针对行优先数组布局优化的算法配置参数时,对于非零值,行优先布局中的子表选择行为会有所优化。

有关详细信息,请参阅模块如何对表数据的子集进行插值

编程用法

模块参数NumSelectionDims
类型:字符向量
值:'0' | '1' | '2' | '3' | '4' | ... | Number of table dimensions
默认值:'0'
代码生成
复选框结果何时使用

on

生成的代码中不包含用来检查超出范围的索引输入的条件语句。

当输入 kf 超出范围时,生成的代码可能会发生未定义的行为。

提高代码效率

off

生成的代码包含用来检查超出范围的索引输入的条件语句。

适用于安全性至关重要的应用领域

如果您的输入没有超出范围,则可以选中删除生成代码中防止超范围索引的代码复选框以提高代码效率。默认情况下,此复选框处于清除状态。对于安全性至关重要的应用,不要选中此复选框。要选中删除生成代码中防止超范围索引的代码复选框,请先检查模型输入是否在范围内。例如:

  1. 清除删除生成代码中防止超范围索引的代码复选框。

  2. 输入超出范围的诊断参数设置为错误

  3. 在普通模式下进行模型仿真。

  4. 如果发生超出范围错误,请将它们更正到范围之内,然后再次运行仿真。

  5. 当仿真不再生成超出范围的输入错误时,选中删除生成代码中防止超范围索引的代码复选框。

    注意

    如果选中了删除生成代码中防止超范围索引的代码复选框而输入 kf 超出范围,生成的代码将发生未定义的行为。

根据您的具体应用,您可以运行以下模型顾问检查,以验证此复选框的使用情形:

  • 按产品 > Embedded Coder > 标识哪些查找表模块会生成检查超范围值的高成本代码

  • 按产品 > Simulink Check > 建模标准 > DO-178C/DO-331 检查 > 检查 Lookup Table 模块的使用情形

有关模型顾问的详细信息,请参阅运行模型顾问检查

此外,要确定选中此复选框是否安全,如果您拥有 Simulink Design Verifier™ 许可证,请考虑使用 Detect Block Input Range Violations (Simulink Design Verifier) 检查。

当出现下列情况之一时,此复选框对生成的代码没有影响:

  • Prelookup 模块将索引值馈送到 Interpolation Using Prelookup 模块。

    来自 Prelookup 模块的索引值始终有效,因此不需要检查代码。

  • 输入 k 的数据类型将数据限制为有效的索引值。

    例如,无符号整数数据类型保证索引值非负。因此,k 的无符号输入值不需要针对负值的检查代码。

编程用法

模块参数RemoveProtectionIndex
类型:字符向量
值:'off' | 'on'
默认值:'off'

指定采样时间间隔。要继承采样时间,请将此参数设置为 -1。有关详细信息,请参阅指定采样时间

依存关系

仅当您将此参数设置为 -1 以外的值时才可见。要了解详细信息,请参阅不建议设置采样时间的模块

编程用法

模块参数:SampleTime
类型:字符串标量或字符向量
默认值:"-1"

数据类型

指定表数据类型。可以将其设置为:

  • 继承数据类型的规则,例如继承: 与输出相同

  • 内置数据类型的名称,例如 single

  • 数据类型对象的名称,例如 Simulink.NumericType 对象

  • 计算结果为数据类型的表达式,例如 fixdt(1,16,0)

点击显示数据类型助手按钮 以显示数据类型助手,以便设置表数据类型。

提示

对于以下情况,指定与输出数据类型不同的表数据类型:

  • 存储表数据(使用的类型小于输出信号)的内存要求较低

  • 在具有不同输出数据类型的两个 Interpolation Using Prelookup 模块之间共享预缩放的表数据

  • 在为具有不同输出数据类型的模块生成的 Simulink Coder™ 代码中共享自定义存储表数据

编程用法

模块参数TableDataTypeStr
类型:字符向量
值:'Inherit: Inherit from table data' | 'Inherit: Same as output' | 'double' | 'single' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16)' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | '<data type expression>'
默认值:'Inherit: Same as input'

将表数据的最小值指定为有限双精度实数标量。默认值为 [](未指定)。

编程用法

模块参数TableMin
类型:字符向量
值:标量
默认值:'[]'

将表数据的最大值指定为有限双精度实数标量。默认值为 [](未指定)。

编程用法

模块参数TableMax
类型:字符向量
值:标量
默认值:'[]'

指定中间结果数据类型。可以将其设置为:

  • 继承数据类型的规则,例如继承: 与输出相同

  • 内置数据类型的名称,例如 single

  • 数据类型对象的名称,例如 Simulink.NumericType 对象

  • 计算结果为数据类型的表达式,例如 fixdt(1,16,0)

数据类型助手可帮助您设置数据属性。要使用数据类型助手,请点击 the Show data type assistant button。有关详细信息,请参阅使用数据类型助手指定数据类型

提示

使用此参数为内部计算指定高于表数据或输出数据的精度。

编程用法

模块参数IntermediateResultsDataTypeStr
类型:字符向量
值:'Inherit: Inherit via internal rule' | 'Inherit: Same as output' | 'double' | 'single' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16)' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | '<data type expression>'
默认值:'Inherit: Same as input'

指定输出数据类型。可以将其设置为:

  • 继承数据类型的规则,例如继承: 通过反向传播继承

  • 内置数据类型的名称,例如 single

  • 数据类型对象的名称,例如 Simulink.NumericType 对象

  • 计算结果为数据类型的表达式,例如 fixdt(1,16,0)

点击显示数据类型助手按钮 可以显示数据类型助手,这有助于您设置输出数据类型。

有关详细信息,请参阅中的控制信号的数据类型

编程用法

模块参数OutDataTypeStr
类型:字符向量
值:'Inherit: Inherit via back propagation' | 'Inherit: Inherit from table data' | 'double' | 'single' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | 'fixdt(1,16,2^0,0)' | '<data type expression>'
默认值'Inherit: Inherit from table data'

将模块应输出的最小值指定为有限实数值标量。默认值为 [](未指定)。Simulink 软件使用此值执行:

编程用法

模块参数OutMin
类型:字符向量
值:标量
默认值:'[]'

将模块应输出的最大值指定为有限实数值标量。默认值为 [](未指定)。Simulink 软件使用此值执行:

编程用法

模块参数OutMax
类型:字符向量
值:标量
默认值:'[]'

指定进行中间计算的内部规则。选择速度可以提高计算速度。但这样可能会损失精度,通常最多 2 位。

编程用法

模块参数InternalRulePriority
类型:字符向量
值:'Speed' | 'Precision'
默认值:'Speed'

选择此参数可防止定点工具覆盖您对此模块指定的数据类型。有关详细信息,请参阅Lock the Output Data Type Setting (Fixed-Point Designer)

编程用法

模块参数LockScale
类型:字符向量
值:'off' | 'on'
默认值:'off'

指定定点运算的舍入模式。有关详细信息,请参阅舍入 (Fixed-Point Designer)

模块参数始终舍入到最邻近的可表示值。要控制模块参数的舍入方法,请在封装字段中使用 MATLAB 舍入函数输入表达式。

编程用法

模块参数RndMeth
类型:字符向量
值:'Ceiling' | 'Convergent' | 'Floor' | 'Nearest' | 'Round' | 'Simplest' | 'Zero'
默认值:'Floor'

指定对溢出是进行饱和处理还是绕回处理。

操作原理说明对溢出的影响示例

选中此复选框 (on)。

您的模型可能有溢出,并且您希望在生成的代码中具有显式饱和保护。

将溢出饱和处理为数据类型能够表示的最小值或最大值。

int8(有符号 8 位整数)数据类型可以表示的最大值为 127。任何大于此最大值的模块运算结果都会导致 8 位整数溢出。如果选中此复选框,模块输出将在达到 127 时饱和。类似地,模块输出将在达到最小输出值 -128 时饱和。

不选中此复选框 (off)。

您需要优化所生成代码的效率。

您希望避免过度地指定信号超出范围时的处理方式。有关详细信息,请参阅信号范围错误故障排除

溢出会绕回到由数据类型表示的适当值。

int8(有符号 8 位整数)数据类型可以表示的最大值为 127。任何大于此最大值的模块运算结果都会导致 8 位整数溢出。清除该复选框时,软件会将导致溢出的值解释为 int8,这可能产生意外结果。例如,以 int8 表示的模块结果 130(二进制 1000 0010)为 -126。

如果选中此复选框,饱和将应用于模块中的每个内部操作,而不仅仅应用于输出或结果。通常,代码生成过程可以检测何时不会发生溢出。在这种情况下,代码生成器不会生成饱和代码。

编程用法

模块参数SaturateOnIntegerOverflow
类型:字符向量
值:'off' | 'on'
默认值:'off'

模块特性

数据类型

double | fixed point | integer | single

直接馈通

多维信号

可变大小信号

过零检测

扩展功能

C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。

定点转换
使用 Fixed-Point Designer™ 设计和仿真定点系统。

版本历史记录

在 R2006b 中推出