|On this page…|
The model sf_varsize_example shows how MATLAB® functions in Stateflow® charts exchange variable-size data with other charts and blocks in the model. To open the model, click sf_varsize_examplesf_varsize_example.
In this model, one Stateflow chart, VarSizeSignalSource, uses temporal logic to generate a variable-size signal. A second chart, size_based_processing, computes the output based on the size of the signal generated by the first chart:
The VarSizeSignalSource chart works like a source block. It has no input and one variable-size output y:
For variable-size outputs, you must explicitly specify the size and upper bound for each dimension. In this case, y is a vector where the first dimension is assumed to be fixed at size 1 and the second dimension is variable with an upper bound of 16.
This chart uses temporal logic to transition between three states, each generating a different size output:
No states or transitions can read from or write to variable-size data. Therefore, y does not appear in any state actions or transition logic. All computations involving variable-size data must occur in MATLAB functions in the chart.
MATLAB functions access variable-size, chart-level data directly. You do not pass the data as inputs or outputs to the functions. In this chart, the generateOutput function adds a different number of elements to the variable-size output y, based on how the active state calls it. The function constructs the variable-size vector from a number sequence, then outputs the transpose of the result:
function generateOutput(len) %#codegen assert(len<=16); y = (1:len)';
MATLAB functions must be able to determine the upper bounds of variable-size data at compile time. In this case, however, the upper bound is len, an input for which the model computes the value at run time. To provide this information, the assert function specifies an explicit upper bound for len, one that matches the upper bound for chart output y.
If you do not include the assert statement, you get a compilation error:
Computed maximum size is not bounded. Static memory allocation requires all sizes to be bounded. The computed size is [1 x :?].
The size_based_processing chart computes a variable-size output based on the value of a variable-size input:
Input u is the variable-size signal generated by the VarSizeSignalSource chart:
Output y is a variable-size signal whose size depends on whether u is a scalar or vector:
The chart uses three MATLAB functions to evaluate the size of input u and generate an associated output y:
As in the chart VarSizeSignalSource, variable-size data does not appear in state actions or transition logic. Instead, states call MATLAB functions to compute the variable-size output. Transitions call a MATLAB function in a conditional statement to evaluate the variable-size input.
This function tests whether chart input u, the signal generated by chart VarSizeSignalSource, is a scalar or vector value:
function isScalar = is_scalar_input %#codegen isScalar = length(u)==1;
If input u is a vector, this function outputs the sine of each of its values:
function compute_output %#codegen y = sin(u);
If input u is a scalar, this function outputs a value of zero:
function reset_output %#codegen y = 0;