Main Content

Stateflow 中向量和矩阵的运算

Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义对向量和矩阵进行计算时使用的语法。动作语言的属性有:

  • MATLAB® 作为动作语言。

  • C 语言作为动作语言。

有关详细信息,请参阅使用 MATLAB 和 C 作为动作语言语法时的差异

索引表示法

在使用 MATLAB 作为动作语言的图中,使用以圆括号为界的从 1 开始的索引来引用向量或矩阵的元素。以逗号分隔不同维度的索引。

在使用 C 语言作为动作语言的图中,使用以方括号为界的从 0 开始的索引来引用向量或矩阵的元素。将不同维度的索引分别包含在一对方括号中。

示例

MATLAB 作为动作语言

C 作为动作语言
向量 V 的第一个元素V(1)V[0]
向量 V 的第 i 个元素V(i)V[i-1]
M 矩阵第 4 行第 5 列的元素M(4,5)M[3][4]
M 矩阵第 i 行第 j 列的元素M(i,j)M[i-1][j-1]

二元运算

下表总结了对向量和矩阵操作数执行的所有二元运算的解释,按优先级顺序列出(1 = 最高,3 = 最低)。二元运算采用左结合,因此在任何表达式中,具有相同优先级的运算符均为从左到右计算。除了使用 MATLAB 作为动作语言的图中的矩阵乘法和除法运算符外,所有二元运算符都执行按元素运算。

运算

优先级

MATLAB 作为动作语言

C 作为动作语言

a * b

1

矩阵乘法。

按元素乘法。要进行矩阵乘法运算,请在 MATLAB 函数中使用 * 运算。请参阅使用 MATLAB 函数执行矩阵算术

a .* b

1

按元素乘法。

不支持。请使用 a * b 运算。

a / b

1

矩阵右除。

按元素右除。要进行矩阵右除,请在 MATLAB 函数中使用 / 运算。请参阅使用 MATLAB 函数执行矩阵算术

a ./ b

1

按元素右除。

不支持。请使用 a / b 运算。

a \ b

1

矩阵左除。

不支持。请在 MATLAB 函数中使用 \ 运算。请参阅使用 MATLAB 函数执行矩阵算术

a .\ b

1

按元素左除。

不支持。请在 MATLAB 函数中使用 .\ 运算。请参阅使用 MATLAB 函数执行矩阵算术

a + b

2

加法。

加法。

a - b

2

减法。

减法。

a == b

3

比较,等于。

比较,等于。

a ~= b

3

比较,不等于。

比较,不等于。

a != b

3

不支持。请使用 a ~= b 运算。

比较,不等于。

a <> b

3

不支持。请使用 a ~= b 运算。

比较,不等于。

一元运算和动作

下表总结了对向量和矩阵操作数执行的所有一元运算和动作的解释。一元运算:

  • 优先于二元运算符。

  • 采用右结合,因此在任何表达式中,它们均为从右向左计算。

  • 执行按元素运算。

示例

MATLAB 作为动作语言

C 作为动作语言

~a

逻辑 NOT。对于按位 NOT,请使用 bitcmp 函数。

  • 按位 NOT(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。

  • 逻辑 NOT。通过清除启用 C 语言位运算图属性来启用此运算。

有关详细信息,请参阅按位运算启用 C 语言位运算

!a

不支持。请使用 ~a 运算。

逻辑 NOT。

-a

求负。

求负。

a++

不支持。

使向量或矩阵的所有元素递增 1。等效于 a = a+1

a--

不支持。

使向量或矩阵的所有元素递减 1。等效于 a = a-1

赋值运算

下表总结了对向量和矩阵操作数执行的赋值运算的解释。

运算

MATLAB 作为动作语言

C 作为动作语言

a = b

简单赋值。

简单赋值。

a += b

不支持。请使用表达式 a = a+b

等效于 a = a+b

a -= b

不支持。请使用表达式 a = a-b

等效于 a = a-b

a *= b

不支持。请使用表达式 a = a*b

等效于 a = a*b

a /= b

不支持。请使用表达式 a = a/b

等效于 a = a/b

为矩阵的单个元素赋值

您可以使用适合图动作语言的索引语法为向量或矩阵的单个项赋值。

示例

MATLAB 作为动作语言

C 作为动作语言
将值 10 赋给向量 V 的第一个元素。V(1) = 10;V[0] = 10;
将值 77 赋给矩阵 M 中第 2 行第 9 列的元素。M(2,9) = 77;M[1][8] = 77;

为矩阵的所有元素赋值

在使用 MATLAB 作为动作语言的图中,您可以使用一个动作指定一个向量或矩阵的所有元素。例如,以下动作为 2×3 矩阵 A 中的每个元素赋一个不同的值:

A = [1 2 3; 4 5 6];

在使用 C 语言作为动作语言的图中,您可以使用标量扩展将向量或矩阵的所有元素设置为相同的值。标量扩展转换标量数据以匹配向量或矩阵数据的维数。例如,以下动作将矩阵 A 的所有元素设置为 10

A = 10;

标量扩展适用于所有图形函数、真值表函数、MATLAB 和 Simulink 函数。假设您将函数 f 的形参定义为标量。下表说明函数调用 y = f(u) 的标量扩展规则。

输出 y输入 u结果
标量标量不发生标量扩展。
标量向量或矩阵图生成大小不匹配错误。
向量或矩阵标量

图使用标量扩展将 f(u) 的标量输出值赋给 y 的每个元素:

y[i][j] = f(u)

向量或矩阵向量或矩阵

图使用标量扩展来计算 u 的每个元素的输出值,并将其赋给 y 的对应元素:

y[i][j] = f(u[i][j])
如果 yu 的大小不同,图会生成大小不匹配错误。

对于具有多个输出的函数,此规则同样适用,但输出和输入均为向量或矩阵时是例外。在这种情况下,图会生成大小不匹配错误,并且不发生标量扩展。

只有固定大小的矩阵支持标量扩展。

使用 MATLAB 作为动作语言的图不支持标量扩展。

使用 MATLAB 函数执行矩阵算术

在使用 C 语言作为动作语言的图中,*/ 运算执行按元素乘法和除法。要在 C 语言状态图中执行标准矩阵乘法和除法,请使用 MATLAB 函数。

假设您要对方阵 u1u2 执行以下运算:

  • 计算标准矩阵乘积 y1 = u1 * u2

  • 求解方程 u1 * y2 = u2

  • 求解方程 y3 * u1 = u2

要在 C 语言状态图中完成这些计算,请添加运行以下代码的 MATLAB 函数:

function [y1, y2, y3] = my_matrix_ops(u1, u2)
%#codegen

y1 = u1 * u2;  % matrix multiplication
y2 = u1 \ u2;  % matrix division from the right
y3 = u1 / u2;  % matrix division from the left
在调用该函数之前,指定输入和输出数据的属性,如设置数据属性中所述。

在使用 MATLAB 作为动作语言的图中,*/\ 运算执行标准矩阵乘法和除法。您可以在状态和转移动作中直接使用这些运算。

相关主题