## Operations for Vectors and Matrices in Stateflow

Stateflow^{®} charts in Simulink^{®} models have an action language property that defines the syntax that you
use to compute with vectors and matrices. The action language properties are:

MATLAB

^{®}as the action language.C as the action language.

For more information, see Differences Between MATLAB and C as Action Language Syntax.

### Indexing Notation

In charts that use MATLAB as the action language, refer to elements of a vector or matrix by using one-based indexing delimited by parentheses. Separate indices for different dimensions with commas.

In charts that use C as the action language, refer to elements of a vector or matrix by using zero-based indexing delimited by brackets. Enclose indices for different dimensions in their own pair of brackets.

Example | MATLAB as the Action Language | C as the Action Language |
---|---|---|

The first element of a vector `V` | `V(1)` | `V[0]` |

The `i` ^{th} element
of a vector `V` | `V(i)` | `V[i-1]` |

The element in row `4` and column
`5` of a matrix
`M` | `M(4,5)` | `M[3][4]` |

The element in row `i` and column
`j` of a matrix
`M` | `M(i,j)` | `M[i-1][j-1]` |

### Binary Operations

This table summarizes the interpretation of all binary operations on vector and matrix operands according to their order of precedence (1 = highest, 3 = lowest). Binary operations are left associative so that, in any expression, operators with the same precedence are evaluated from left to right. Except for the matrix multiplication and division operators in charts that use MATLAB as the action language, all binary operators perform element-wise operations.

Operation | Precedence | MATLAB as the Action Language | C as the Action Language |
---|---|---|---|

| 1 | Matrix multiplication. | Element-wise multiplication. For matrix multiplication,
use the |

| 1 | Element-wise multiplication. | Not supported. Use the operation |

| 1 | Matrix right division. | Element-wise right division. For matrix right division,
use the |

| 1 | Element-wise right division. | Not supported. Use the operation |

| 1 | Matrix left division. | Not supported. Use the |

| 1 | Element-wise left division. | Not supported. Use the |

| 2 | Addition. | Addition. |

| 2 | Subtraction. | Subtraction. |

| 3 | Comparison, equal to. | Comparison, equal to. |

| 3 | Comparison, not equal to. | Comparison, not equal to. |

| 3 | Not supported. Use the operation | Comparison, not equal to. |

| 3 | Not supported. Use the operation | Comparison, not equal to. |

### Unary Operations and Actions

This table summarizes the interpretation of all unary operations and actions on vector and matrix operands. Unary operations:

Have higher precedence than the binary operators.

Are right associative so that, in any expression, they are evaluated from right to left.

Perform element-wise operations.

Example | MATLAB as the Action Language | C as the Action Language |
---|---|---|

| Logical NOT. For bitwise NOT, use the |
Bitwise NOT (default). Enable this operation by selecting the **Enable C-bit operations**chart property.Logical NOT. Enable this operation by clearing the **Enable C-bit operations**chart property.
For more information, see Bitwise Operations and Enable C-bit operations. |

| Not supported. Use the operation
| Logical NOT. |

| Negative. | Negative. |

| Not supported. | Increment all elements of the vector or matrix. Equivalent
to |

| Not supported. | Decrement all elements of the vector or matrix. Equivalent
to |

### Assignment Operations

This table summarizes the interpretation of assignment operations on vector and matrix operands.

Operation | MATLAB as the Action Language | C as the Action Language |
---|---|---|

| Simple assignment. | Simple assignment. |

| Not supported. Use the expression | Equivalent to |

| Not supported. Use the expression | Equivalent to |

| Not supported. Use the expression | Equivalent to |

| Not supported. Use the expression | Equivalent to |

#### Assign Values to Individual Elements of a Matrix

You can assign a value to an individual entry of a vector or matrix by using the indexing syntax appropriate to the action language of the chart.

Example | MATLAB as the Action Language | C as the Action Language |
---|---|---|

Assign the value `10` to the first
element of the vector `V` . | `V(1) = 10;` | `V[0] = 10;` |

Assign the value 77 to the element in row 2 and column 9
of the matrix `M` . | `M(2,9) = 77;` | `M[1][8] = 77;` |

#### Assign Values to All Elements of a Matrix

In charts that use MATLAB as the action language, you can use a single action to specify all
of the elements of a vector or matrix. For example, this action assigns each
element of the 2-by-3 matrix `A`

to a different
value:

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

In charts that use C as the action language, you can use *scalar
expansion* to set all of the elements of a vector or matrix to
the same value. Scalar expansion converts scalar data to match the dimensions of
vector or matrix data. For example, this action sets all of the elements of the
matrix `A`

to
`10`

:

A = 10;

Scalar expansion applies to all graphical, truth table, MATLAB, and Simulink functions. Suppose that you define the formal arguments of a
function `f`

as scalars. This table describes the rules of
scalar expansion for the function call ```
y =
f(u)
```

.

Output `y` | Input `u` | Result |
---|---|---|

Scalar | Scalar | No scalar expansion occurs. |

Scalar | Vector or matrix | The chart generates a size mismatch error. |

Vector or matrix | Scalar | The chart uses scalar expansion to assign the
scalar output value of y[i][j] = f(u) |

Vector or matrix | Vector or matrix | The chart uses scalar expansion to compute an
output value for each element of y[i][j] = f(u[i][j]) `y` and `u` do not
have the same size, the chart generates a size mismatch
error. |

For functions with multiple outputs, the same rules apply unless the outputs and inputs are all vectors or matrices. In this case, the chart generates a size mismatch error and scalar expansion does not occur.

Only fixed-size matrices support scalar expansion.

Charts that use MATLAB as the action language do not support scalar expansion.

### Perform Matrix Arithmetic by Using MATLAB Functions

In charts that use C as the action language, the operations `*`

and `/`

perform element-wise multiplication and division. To
perform standard matrix multiplication and division in a C chart, use a MATLAB function.

Suppose that you want to perform these operations on the square matrices
`u1`

and `u2`

:

Compute the standard matrix product

`y1 = u1 * u2`

.Solve the equation

`u1 * y2 = u2`

.Solve the equation

`y3 * u1 = u2`

.

To complete these calculations in a C chart, add a MATLAB function that runs this code:

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

In charts that use MATLAB as the action language, the operations `*`

,
`/`

, and `\`

perform standard matrix
multiplication and division. You can use these operations directly in state and
transition actions.