Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

Add, Subtract, Sum of Elements, Sum

输入信号的加减运算

  • Add block

库:
Simulink / Math Operations
HDL Coder / HDL Floating Point Operations
HDL Coder / Math Operations

描述

Sum 模块对输入信号执行加减运算。Add、Subtract、Sum of Elements 和 Sum 模块是相同的模块。此模块可对标量、向量或矩阵输入执行加减运算。它还可以缩减信号的元素并执行求和。

您可以使用符号列表参数以及加号 (+)、减号 (-) 和分隔符 (|) 指定模块的运算。

  • +- 字符的个数等于输入的个数。例如,+-+ 需要三个输入。模块从第一个(顶部)输入信号中减去第二个(中间)输入信号,然后加上第三个(底部)输入信号。

  • 分隔符在模块图标上的端口之间产生额外空间。

  • 如果仅执行加法,则可以使用一个与输入个数相等的数值。

  • 如果只有一个输入端口,则单个 +- 会在所有维度上或在指定的维度中加上或减去元素。

Sum 模块首先将输入数据类型转换为其累加器数据类型,然后执行指定的运算。最后,模块使用指定的舍入和溢出模式,将计算结果转换为输出数据类型。

模块输出的计算

Sum 模块的输出计算取决于模块输入的个数和输入端口的符号:

如果 Sum 模块有...而且...输出计算公式为...其中...

一个输入端口

输入端口符号为 + 号

y = e[0] + e[1] + e[2] ... + e[m]


e[i] 是输入 u 的第 i 个元素

输入端口符号为 – 号

y = 0.0 – e[0] – e[1] – e[2] ... – e[m]


两个或更多输入端口

所有输入端口符号均为 – 号

y = 0.0 – u[0] – u[1] – u[2] ... – u[n]


u[i] 是第 i 个输入端口的输入

k 个输入端口是第一个符号为 + 号的端口

y = u[k] – u[0] – u[1] – u[2] – u[k–1] (+/–) u[k+1] ... (+/–) u[n]


端口

输入

全部展开

输入可以具有不同的数据类型,除非您选中了要求所有输入具有相同的数据类型参数。

用于加法或减法运算的输入信号。如果只有一个输入信号,则对所有维度或指定维度中的元素执行加法或减法。

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

运算的第 n 个输入信号。输入的个数与符号列表参数中的符号个数相匹配。模块按照列出的顺序将运算应用于输入。您还可以使用一个与输入端口个数相等的数值作为符号列表参数。模块创建输入端口并将加法应用于所有输入。例如,如果为符号列表参数赋值 5,则模块创建 5 个输入端口并将它们相加以产生输出。

所有的非标量输入信号必须具有相同的维度。标量输入将扩展为与其他输入具有相同的维度。

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

输出

全部展开

加法和/或减法运算产生的输出信号。输出信号具有与输入信号相同的维度。

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

参数

全部展开

常设

将模块的图标形状指定为矩形或圆形。

对于矩形模块,第一个输入端口是顶部端口。对于一个圆形 Sum 模块,第一个输入端口最靠近 12 点钟位置,按逆时针方向围绕模块。类似地,其他输入端口也按逆时针方向围绕模块。

编程用法

模块参数IconShape
类型:字符向量
'rectangular' | 'round'
默认值'round'

输入对输入信号执行的加法和减法运算。为每个运算创建一个输入端口。分隔符 (|) 在模块图标上的输入端口之间产生额外空间。加法是默认运算。如果您只想将输入信号相加,请键入输入端口的个数。各项运算按所列顺序执行。

只输入一个元素时,模块将启用求和维度参数。对于单个向量输入,+- 会在所有维度上或在指定的维度中加上或减去元素。

提示

您可以通过在符号列表参数中的符号之间插入分隔符 (|) 来控制输入端口在模块上的位置。例如,“++|--”将在第二个和第三个输入端口之间留出额外空间。

编程用法

模块参数Inputs
类型:字符向量
'+' | '-' | | | 整数
默认值'++'

选择模块执行求和运算所用的维度。

选择所有维度,则所有输入元素累加求和。选择配置参数 使用针对行优先数组布局优化的算法 时,Simulink® 为仿真启用行优先算法。要生成行优先代码,除选择使用针对行优先数组布局优化的算法外,还要将配置参数 数组布局 (Simulink Coder) 设置为行优先。列优先算法和行优先算法仅在求和顺序上不同。在某些情况下,由于对同一数据集的运算顺序不同,列优先算法和行优先算法的输出可能存在微小的数值差异。

选择指定的维度,则会出现另一个参数维度。选择对向量输入求和所用的特定维度。

依存关系

符号列表参数中仅列出一个符号时启用。

编程用法

模块参数CollapseMode
类型:字符向量
'All dimensions' | 'Specified dimension'
默认值'All dimensions'

当为求和维度参数选择指定的维度时,请指定执行运算所用的维度。

模块遵循的求和规则与 MATLAB® 中的 sum 函数相同。

假设您有一个 2×3 矩阵 U

  • 如果将维度设置为 1,输出 Y 的计算公式如下:

    Y=i=12U(i,j)

  • 如果将维度设置为 2,输出 Y 的计算公式如下:

    Y=j=13U(i,j)

如果指定的维度大于输入的维度,则会显示错误消息。

依存关系

求和维度参数选择指定的维度时启用。

编程用法

模块参数CollapseDim
类型:字符向量
integer
默认值'1'

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

依存关系

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

编程用法

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

信号属性

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

指定输入信号是否必须全部具有相同的数据类型。如果启用此参数,则在输入信号类型不同时,仿真过程中会发生错误。

编程用法

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

选择累加器的数据类型。该类型可以继承、直接指定或表示为数据类型对象,如 Simulink.NumericType。如果您选择 继承: 从内部规则继承,Simulink 在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。

编程用法

模块参数 AccumDataTypeStr
类型:字符向量
'Inherit: Inherit via internal rule | 'Inherit: Same as first input' | 'double''single' | 'half' | '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: Inherit via internal rule'

Simulink 检查的输出范围的下限值。

Simulink 使用最小值执行下列操作:

注意

输出最小值不会饱和或剪切实际输出信号。请改用 Saturation 模块。

编程用法

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

Simulink 检查的输出范围的上限值。

Simulink 使用最大值执行下列操作:

注意

输出最大值不会饱和或剪切实际输出信号。请改用 Saturation 模块。

编程用法

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

为输出选择数据类型。该类型可以继承、直接指定或表示为数据类型对象,如 Simulink.NumericType

当您选择继承的选项时,模块的行为如下所示:

  • 继承: 从内部规则继承 - Simulink 在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。

    注意

    累加器内部规则的优点是数值更准确,而代价可能是生成的代码效率低下。要获取相同的输出精度,请将输出数据类型设置为 Inherit: Inherit same as accumulator

    注意

    当输入是小于单精度的浮点数据类型时,继承: 从内部规则继承输出数据类型取决于 Inherit floating-point output type smaller than single precision 配置参数的设置。当对数据类型进行编码所需的位数小于对单精度数据类型编码所需的 32 位时,数据类型小于单精度。例如,halfint16 小于单精度。

  • 继承: Keep MSB - Simulink 选择一种能够保持运算的完整范围的数据类型,然后将输出精度降低到适合嵌入式目标硬件的大小。

    提示

    要获得更高效的生成代码,请将累加器数据类型设置为继承: 从内部规则继承,并取消选择对整数溢出进行饱和处理参数。

    此规则从不产生溢出。

  • 继承: Keep LSB - Simulink 选择一种保持运算精度的数据类型,但如果完整类型不适合嵌入式目标硬件,则会缩小范围。

    提示

    要获得更高效的生成代码,请将累加器数据类型设置为继承: 从内部规则继承,并取消选择对整数溢出进行饱和处理参数。

    此规则可能产生溢出。

    如果更改了嵌入式目标的设置,则依这些内部规则选择的数据类型可能会发生变化。有时软件不能同时满足优化代码效率和保证数值准确性这两个需求。如果这些规则不能满足您对数值准确性或性能的特定需求,请使用下列选项之一:

    • 显式指定输出数据类型。

    • 使用简单的选项继承: 与第一个输入相同

    • 显式指定默认数据类型(例如 fixdt(1,32,16)),然后使用定点工具为您的模型提供数据类型建议。有关详细信息,请参阅 fxptdlg (Fixed-Point Designer)

    • 要指定您自己的继承规则,请使用继承: 通过反向传播继承,然后使用 Data Type Propagation 模块。有关如何使用此模块的示例说明,请参阅 Signal Attributes 模块库中的 Data Type Propagation Examples 模块。

  • 继承: 通过反向传播继承 - 使用驱动模块的数据类型。

  • 继承: 与第一个输入相同 - 使用第一个输入信号的数据类型。

  • 继承: Inherit same as accumulator - 使用累加器的数据类型。

编程用法

模块参数OutDataTypeStr
类型:字符向量
'Inherit: Inherit via internal rule|'Inherit: Keep MSB'|'Inherit: Keep LSB' | 'Inherit: Inherit via back propagation''Inherit: Same as first input' | 'Inherit: Same as accumulator' | 'double' | 'single' | 'half' | '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: Inherit via internal rule'

选择此选项可锁定数据类型设置,防止使用定点工具和定点顾问进行更改。有关详细信息,请参阅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'

模块特性

数据类型

Boolean | double | fixed point | half | integer | single

直接馈通

多维信号

可变大小信号

过零检测

扩展功能

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

PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。

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

版本历史记录

在 R2006a 之前推出