主要内容

Stateflow 中向量和矩阵的运算

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

  • MATLAB® 作为动作语言。

  • C 语言作为动作语言。

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

索引表示法

访问向量和矩阵元素的方式取决于图的动作语言。

使用 MATLAB 作为动作语言的图使用从 1 开始的索引和圆括号。对于多维数组,在单对圆括号内用以逗号分隔索引,例如 M(i,j)

使用 C 语言作为动作语言的图使用从 0 开始的索引和方括号。对于多维数组,将每个维度索引括在其自己的方括号对中,例如 M[i][j]

示例

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 作为动作语言的图中,*/\ 运算符改为执行矩阵运算。

乘法和除法运算(优先级 1)

运算

MATLAB 作为动作语言

C 作为动作语言

a * b

矩阵乘法。

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

a .* b

按元素乘法。

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

a / b

矩阵右除。

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

a ./ b

按元素右除。

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

a \ b

矩阵左除。

不支持。请在 MATLAB 函数中使用 \ 运算。

a .\ b

按元素左除。

不支持。请在 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 作为动作语言的图中,*/\ 运算执行标准矩阵乘法和除法。您可以在状态和转移动作中直接使用这些运算。

加法和减法运算(优先级 2)

运算

MATLAB 作为动作语言

C 作为动作语言

a + b

加法。

加法。

a - b

减法。

减法。

比较运算(优先级 3)

运算

MATLAB 作为动作语言

C 作为动作语言

a == b

比较,等于。

比较,等于。

a ~= b

比较,不等于。

比较,不等于。

a != b

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

比较,不等于。

a <> b

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

比较,不等于。

一元运算和动作

一元运算应用于单个值,其行为与二元运算不同。一元运算:

  • 优先于二元运算符。

  • 采用右结合。换句话说,图从右到左计算它们。

  • 执行按元素运算。

运算

MATLAB 作为动作语言

C 作为动作语言

~a

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

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

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

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

!a

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

逻辑非。

-a

求负。

求负。

a++

不支持。

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

a--

不支持。

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

赋值运算

赋值运算将值存储在变量中。使用 C 语言作为动作语言的图支持将算术运算与赋值相结合的复合赋值运算符。

运算

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 函数。

对于具有标量形参的函数 y = f(u)

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

y 的每个元素都接收标量输出 y[i][j] = f(u)

向量或矩阵向量或矩阵

按元素运算 y[i][j] = f(u[i][j])

如果 yu 具有不同大小,则发生大小不匹配错误。

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

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

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

另请参阅

主题