目录
支持的向量和矩阵运算
Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义对向量和矩阵进行计算时使用的语法。动作语言的属性有:
-
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 函数中使用 * 运算。 |
a .* b | 1 | 按元素乘法。 | 不支持。请使用 a * b 运算。 |
a / b | 1 | 矩阵右除。 | 按元素右除。要进行矩阵右除,请在 MATLAB 函数中使用 |
a ./ b | 1 | 按元素右除。 | 不支持。请使用 a / b 运算。 |
a \ b | 1 | 矩阵左除。 | 不支持。请在 MATLAB 函数中使用 \ 运算。 |
a .\ b | 1 | 按元素左除。 | 不支持。请在 MATLAB 函数中使用 |
a + b | 2 | 加法。 | 加法。 |
a - b | 2 | 减法。 | 减法。 |
| 3 | 比较,等于。 | 比较,等于。 |
a ~= b | 3 | 比较,不等于。 | 比较,不等于。 |
a != b | 3 | 不支持。请使用 a ~= b 运算。 | 比较,不等于。 |
a <> b | 3 | 不支持。请使用 a ~= b 运算。 | 比较,不等于。 |
一元运算和动作
下表总结了对向量和矩阵操作数执行的所有一元运算和动作的解释。一元运算:
-
优先于二元运算符。
-
采用右结合,因此在任何表达式中,它们均为从右向左计算。
-
执行按元素运算。
示例 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
~a | 逻辑 NOT。对于按位 NOT,请使用bitcmp函数。 |
|
!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])如果 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 作为动作语言的图中,*
、/
和 \
运算执行标准矩阵乘法和除法。可以在状态和转移动作中直接使用这些运算。