Main Content

确定信号维度

Simulink® 模块可以输出一维、二维或多维信号。Simulink 用户界面和文档中通常将一维信号称为向量,将二维或多维信号称为矩阵。包含一个元素的数组通常称为标量行向量是指包含一行的二维数组。列向量是指包含一列的二维数组。

  • 一维 (1-D) 信号包含一系列按照每个仿真时间步一个数组(向量)的频率输出的一维数组。

  • 二维 (2-D) 信号包含一系列按照每个模块采样时间一个二维数组(矩阵)的频率输出的二维数组。

  • 多维信号包含一系列按照每个模块采样时间一个数组的频率输出的多维(二维或更多维)数组。您可以使用任何有效的 MATLAB® 多维表达式(例如 [4 3])指定多维数组。有关多维数组的信息,请参阅多维数组

Simulink 模块可以接受或输出的信号维度因模块而异。有些模块可以接受或输出任意维度的信号。有些只能接受或输出标量或向量信号。

注意

Simulink 在仿真过程中不支持动态信号维度。也就是说,信号的维度在执行仿真时必须保持不变。但是,您可以在仿真过程中更改信号的大小。请参阅可变大小信号基础知识

如果一个模块可以发出非标量信号,假如是源模块,则其输出信号的维度取决于模块参数;否则,输出信号的维度取决于模块输入信号的维度和模块参数。

要确定信号最终用于仿真的维度,请首先更新模块图(例如,按 Ctrl+D)。然后,选择以下方法之一:

  • 在模块图上直接显示维度。使用此方法沿着模块的路径跟踪信号维度。在模型中,在调试选项卡上,选择叠加信息 > 信号维度

  • 检查模型数据编辑器中的维度,它将信息显示在一个可搜索、可排序的表中。在该表中,维度列中每个单元格的右侧显示模型中相应信号线的真实维度。

支持多维信号的 Simulink 模块

Simulink 模块数据类型支持表中有一列标识了哪些模块支持多维信号。

  1. 在 MATLAB 命令行中,输入 showblockdatatypetable

    此时将打开一个单独的窗口,显示 Simulink 模块数据类型支持表。

  2. 在“模块”列中,找到 Simulink 模块的名称。右侧的列是该模块的数据类型或功能。如果一列中包含 X 标记,即说明支持该功能。

Simulink 支持最多具有 32 个维度的信号。不要使用超过 32 个维度的信号。

确定源模块的输出维度

模块是指没有输入信号的模块。源模块的示例包括 Constant 模块和 Sine Wave 模块。有关 Simulink 源模块的完整列表,请参阅Sources。如果源模块将向量参数解释为一维向量参数处于禁用状态(即未在模块参数对话框中选中),则输出维度与其输出值参数的维度相同。如果将向量参数解释为一维向量参数处于启用状态,则输出维度等于输出值参数维度,除非参数维度为 N×1 或 1×N。如果是后一种情况,模块将输出宽度为 N 的向量信号。

这里我们以 Constant 模块为例,了解源模块的输出值参数和将向量参数解释为一维向量参数如何决定其输出维度。此模块输出等于其常量值参数的常量信号。下表说明常量值参数的维度和将向量参数解释为一维向量参数的设置如何决定模块输出维度。

常量值将向量参数解释为一维向量输出

标量

off

一元素数组

标量

on

一元素数组

1×N 矩阵

off

1×N 矩阵

1×N 矩阵

on

N 元素向量

N×1 矩阵

off

N×1 矩阵

N×1 矩阵

on

N 元素向量

M×N 矩阵

off

M×N 矩阵

M×N 矩阵

on

M×N 矩阵

Simulink 源模块允许您指定输出信号的维度,或指定 Simulink 可从中推断出维度的值。因此,您可以使用源模块在您的模型中引入各种维度的信号。

确定非源模块的输出维度

如果一个模块有输入,则其输出维度在标量扩展之后与输入维度相同。(所有输入必须具有相同的维度,如信号和参数维度规则中所述)。

信号和参数维度规则

创建 Simulink 模型时,必须遵循有关信号和参数维度的以下规则。

输入信号维度规则

一个模块的所有非标量输入必须具有相同的维度。

一个模块可以具有混合的标量和非标量输入,但所有非标量输入必须具有相同的维度。Simulink 会对标量输入进行扩展,使其具有与非标量输入相同的维度(请参阅输入信号和参数的标量扩展)。

模块参数维度规则

一般而言,模块参数必须与模块输入具有相同的维度。Simulink 会执行一些处理,在一般规则的基础上增添一些灵活性。

  • 模块可以具有与非标量输入对应的标量参数。在这种情况下,Simulink 会对标量参数进行扩展,使其与对应的输入具有相同的维度(请参阅输入信号和参数的标量扩展)。

  • 如果输入是向量,对应的参数可以是 N×1 或 1×N 矩阵。在这种情况下,Simulink 会将 N 个矩阵元素应用于输入向量的对应元素。这一例外允许使用 MATLAB 行或列向量(实际上分别是 1×N 或 N×1 矩阵)指定应用于向量输入的参数。

向量或矩阵输入转换规则

在以下情况下,Simulink 会将向量转换为行或列矩阵,或者将行或列矩阵转换为向量:

  • 如果一个向量信号连接的输入端口需要矩阵,Simulink 则将该向量转换为单行或单列矩阵。

  • 如果一个单列或单行矩阵连接的输入端口需要向量,Simulink 则将矩阵转换为向量。

  • 如果一个模块的输入信号混合了向量和矩阵,而且矩阵输入全都为单列或单行矩阵,Simulink 则将向量分别转换为单列或单行矩阵。

    注意

    您可以配置 Simulink,使其在仿真过程中发生向量或矩阵转换时显示警告或错误消息。有关详细信息,请参阅 Vector/matrix block input conversion

输入信号和参数的标量扩展

标量扩展是指将标量值转换为非标量数组。许多 Simulink 模块支持对输入信号和参数进行标量扩展。模块特定的描述会指明 Simulink 是否会对该模块的输入信号和参数进行标量扩展。

输入信号的标量扩展是指对标量输入进行扩展,使其与其他非标量输入或非标量参数的维度相匹配。如果模块输入混合了标量和非标量信号,Simulink 会将标量输入扩展为与其他非标量输入具有相同维度的非标量信号。例如,如果关联的非标量信号的维度为 3,标量 4 会扩展为向量 [4 4 4]。

参数的标量扩展是指对标量模块参数进行扩展,使其与非标量输入的维度相匹配。

输入关联的模块参数标量扩展

标量

非标量

扩展输入以匹配参数维度。

请参阅标量输入和非标量参数

非标量

标量

扩展标量参数,以匹配输入中的元素数。

请参阅非标量输入和标量参数

混合标量和非标量

无对应参数

扩展标量输入,以匹配最大非标量输入的维度。

请参阅标量和非标量输入,无关联参数

标量输入和非标量参数

在此示例中,从 Constant 模块到 Gain 模块的输入为标量。Gain 模块的增益参数为非标量。Simulink 对标量输入进行扩展,使其与非标量增益参数的维度相匹配,这一点反映在 Display 模块的仿真结果中。

非标量输入和标量参数

在此示例中,从 Constant 模块到 Gain 模块的输入为非标量。Gain 模块的增益参数为标量。Simulink 对标量参数进行扩展,使其与来自 Constant 模块的非标量输入的维度相匹配,这一点反映在 Display 模块的仿真结果中。

标量和非标量输入,无关联参数

在此示例中,从 Constant1 模块到 Sum 模块的输入为非标量,来自 Constant2 模块的输入为标量。Sum 模块没有关联的参数。Simulink 将来自 Constant2 模块的标量输入进行扩展,以匹配来自 Constant1 模块的非标量输入的维度。输入扩展为向量 [3 3 3]

获取编译的端口维度

这些示例说明如何在编译期间使用 CompiledPortDimensions 参数获得 Simulink 模型中模块的端口信号的维度。对于非总线信号,端口信号的维数表示与查询端口相关联的信号的维度。对于总线,端口信号的维度包括与查询端口相关联的总线类型、总线携带的信号数量以及这些信号的维度。要显示信号维度,请在 Simulink 编辑器的调试选项卡上,点击叠加信息 > 信号 > 信号维度。有关信号维度的详细信息,请参阅信号维度

获取非总线信号的编译端口维度

查询 Constant 模块的输出端口时,获取 Constant 模块的端口信号的维度。由于该模块输出非总线信号 OutSig,由 dim 数组表示的端口信号的维数是非总线输出信号的维度。

使用 SimulationCommand 以编程方式步进 ex_nonBusPortDim 模型。

open_system('ex_nonBusPortDim.slx')
set_param('ex_nonBusPortDim','SimulationCommand','start')
set_param('ex_nonBusPortDim','SimulationCommand','pause')

ex_nonBusPortDim.png

使用 PortHandles 参数以编程方式将模块名称存储在变量中。然后,使用 CompiledPortDimensions 参数获取维度。

gcb='ex_nonBusPortDim/Constant';
ph= get_param(gcb,'PortHandles');
dim= get_param(ph.Outport,'CompiledPortDimensions')
dim = 1×3

     2     2     3

对于非总线信号,结果是一个数组,其中第一个元素是 2,这是 OutSig 的维数。接下来的两个元素是 23,它们是维度的值。

要以编程方式停止仿真,请使用 SimulationCommand

set_param('ex_nonBusPortDim','SimulationCommand','stop')

获取虚拟总线的编译端口维度

查询 Bus Creator1 模块的输出端口时,获取 Bus Creator 模块的端口信号维度。当模块输出虚拟总线时,由 dim 数组表示的端口信号的维度由与 Bus Creator1 模块的输出端口相关联的总线类型、总线携带的信号数量以及这些信号的维度组成。

使用 SimulationCommand 以编程方式步进 ex_virtualBusPortDim 模型。

open_system('ex_virtualBusPortDim.slx')
set_param('ex_virtualBusPortDim','SimulationCommand','start')
set_param('ex_virtualBusPortDim','SimulationCommand','pause')

ex_virtualBusPortDim.png

使用 PortHandles 参数以编程方式将模块名称存储在变量中。然后,使用 CompiledPortDimensions 参数获取维度。

gcb='ex_virtualBusPortDim/Bus Creator1';
ph= get_param(gcb,'PortHandles');
dim= get_param(ph.Outport,'CompiledPortDimensions')
dim = 1×16

    -2     4     1     2     1     1     3     4     5     6     5     2     3     4     5     6

对于总线,结果会包括额外的元素。第一个元素是 -2,表示 Bus Creator1 模块的输出端口对应一个虚拟总线。第二个元素是叶节点的数量 4。随后的元素遵循与非总线信号相同的模式。

  • 第一个叶节点的输出端口有 1 个维度,该维度中的值为 2

  • 第二个叶节点的输出端口有 1 个维度,该维度中的值为 1

  • 第三个叶节点的输出端口有 3 个维度,这些维度中的值为 4 5 6

  • 第四个叶节点的输出端口有 5 个维度,这些维度中的值为 2 3 4 5 6

要以编程方式停止仿真,请使用 SimulationCommand

set_param('ex_virtualBusPortDim','SimulationCommand','stop')

获取非虚拟总线的编译端口维度

查询 Bus Creator1 模块的输出端口时,获取 Bus Creator 模块的端口信号维度。Bus Creator1 模块在其输入端口之一接收非虚拟总线,并输出虚拟总线。当模块输出虚拟总线时,由 dim 数组表示的端口信号的维度由与 Bus Creator1 模块的输出端口相关联的总线类型、总线携带的信号数量以及这些信号的维度组成。

使用 SimulationCommand 步进 ex_nonvirtualBusPortDim

open_system('ex_nonvirtualBusPortDim.slx')
set_param('ex_nonvirtualBusPortDim','SimulationCommand','start')
set_param('ex_nonvirtualBusPortDim','SimulationCommand','pause')

ex_nonvirtualBusPortDim.png

使用 PortHandles 参数以编程方式将模块名称存储在变量中。然后,使用 CompiledPortDimensions 参数获取维度。

gcb='ex_nonvirtualBusPortDim/Bus Creator1';
ph= get_param(gcb,'PortHandles');
dim= get_param(ph.Outport,'CompiledPortDimensions')
dim = 1×8

    -2     3     1     2     1     1     1     1

查询维度时,非虚拟总线被视为标量。第一个元素是 -2,表示 Bus Creator1 模块的输出端口对应一个虚拟总线。 dim 数组中的第二个元素是 3,它表示三个叶节点而不是四个叶节点,因为非虚拟总线被视为标量。随后的元素遵循与非总线信号相同的模式。

  • 第一个叶节点的输出端口有 1 个维度,该维度中的值为 2

  • 第二个叶节点的输出端口有 1 个维度,该维度中的值为 1

  • 第三个叶节点对应于输出非虚拟总线 NestedBus 的 Bus Creator 模块。第三个叶节点的输出端口有 1 个维度,该维度中的值为 1

要以编程方式停止仿真,请使用 SimulationCommand

set_param('ex_nonvirtualBusPortDim','SimulationCommand','stop')

相关主题