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 作为动作语言 |
---|---|---|---|
| 1 | 矩阵乘法。 | 按元素乘法。要进行矩阵乘法运算,请在 MATLAB 函数中使用 |
| 1 | 按元素乘法。 | 不支持。请使用 |
| 1 | 矩阵右除。 | 按元素右除。要进行矩阵右除,请在 MATLAB 函数中使用 |
| 1 | 按元素右除。 | 不支持。请使用 |
| 1 | 矩阵左除。 | 不支持。请在 MATLAB 函数中使用 |
| 1 | 按元素左除。 | 不支持。请在 MATLAB 函数中使用 |
| 2 | 加法。 | 加法。 |
| 2 | 减法。 | 减法。 |
| 3 | 比较,等于。 | 比较,等于。 |
| 3 | 比较,不等于。 | 比较,不等于。 |
| 3 | 不支持。请使用 | 比较,不等于。 |
| 3 | 不支持。请使用 | 比较,不等于。 |
一元运算和动作
下表总结了对向量和矩阵操作数执行的所有一元运算和动作的解释。一元运算:
优先于二元运算符。
采用右结合,因此在任何表达式中,它们均为从右向左计算。
执行按元素运算。
示例 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
| 逻辑 NOT。对于按位 NOT,请使用 |
有关详细信息,请参阅Bitwise Operations和启用 C 语言位运算。 |
| 不支持。请使用 | 逻辑 NOT。 |
| 求负。 | 求负。 |
| 不支持。 | 使向量或矩阵的所有元素递增 1。等效于 |
| 不支持。 | 使向量或矩阵的所有元素递减 1。等效于 |
赋值运算
下表总结了对向量和矩阵操作数执行的赋值运算的解释。
运算 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
| 简单赋值。 | 简单赋值。 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
为矩阵的单个元素赋值
您可以使用适合图动作语言的索引语法为向量或矩阵的单个项赋值。
示例 | 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 | 结果 |
---|---|---|
标量 | 标量 | 不发生标量扩展。 |
标量 | 向量或矩阵 | 图生成大小不匹配错误。 |
向量或矩阵 | 标量 | 图使用标量扩展将 y[i][j] = f(u) |
向量或矩阵 | 向量或矩阵 | 图使用标量扩展来计算 y[i][j] = f(u[i][j]) y 和 u 的大小不同,图会生成大小不匹配错误。 |
对于具有多个输出的函数,此规则同样适用,但输出和输入均为向量或矩阵时是例外。在这种情况下,图会生成大小不匹配错误,并且不发生标量扩展。
使用 MATLAB 作为动作语言的图不支持标量扩展。
使用 MATLAB 函数执行矩阵算术
在使用 C 语言作为动作语言的图中,*
和 /
运算执行按元素乘法和除法。要在 C 语言状态图中执行标准矩阵乘法和除法,请使用 MATLAB 函数。
假设您要对方阵 u1
和 u2
执行以下运算:
计算标准矩阵乘积
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 作为动作语言的图中,*
、/
和 \
运算执行标准矩阵乘法和除法。您可以在状态和转移动作中直接使用这些运算。