MATLAB: How to write a Level-2 MATLAB S-Function where the input and output might have unknown dimensions, or even be variable-size signals

dimensions-functionsfunctionsimulinksize;unknownvariable

I need to write a Level-2 MATLAB S-Function where the input and/or output dimensions are unknown, and might also change during simulation.
Specifically, I would like to implement the two following scenarios:
A) Input: 1-D array of unknown fixed size. Two outputs: sorted array, and sum of all the elements.
B) Same as A), but the size of the array might vary during simulation.
How can I achieve this?

Best Answer

A)
In the setup function of your MATLAB S-Function, you need to configure port properties to be inherited or dynamic:
>> block.SetPreCompInpPortInfoToDynamic;
>> block.SetPreCompOutPortInfoToDynamic;
You can then override the only properties that you known, as for example:
>> block.InputPort(1).DatatypeID = 0;
>> block.InputPort(1).Complexity = 'Real';
>> block.InputPort(1).DirectFeedthrough = true;
>> block.OutputPort(1).DatatypeID = 0;
>> block.OutputPort(1).Complexity = 'Real';
>> block.OutputPort(2).Dimensions = 1;
>> block.OutputPort(2).DatatypeID = 0;
>> block.OutputPort(2).Complexity = 'Real';
Note how the field 'Dimensions' has not been set for InputPort(1) and OutputPort(1).
B)
Similar to A), but the required input and output ports need to be configured so that they can handle variable-size signals:
>> block.InputPort(1).DimensionsMode = 'Variable';
>> block.OutputPort(1).DimensionsMode = 'Variable';
In addition, in the Outputs function, you need to set the current dimensions of the output port:
>> block.OutputPort(1).CurrentDimensions = block.InputPort(1).CurrentDimensions;
For further details, please refer to the attached files:
A) matlabSfunUnknownSize.m and simpleTestMsfUnknownSize.slx
B) matlabSfunVarSize.m and simpleTestMsfVarSize.slx
and simulate the models step-by-step.
For more information on: