MATLAB Answers

Greg
0

Variable-Sized Output from MATLAB Function block

Asked by Greg
on 29 Apr 2014
Latest activity Edited by timo
on 18 Sep 2016
I'm trying to create a MATLAB Function block with a variable-sized output in a Simulink model (R2014A and R2013B).
All that's in my Function block at the moment is the following:
function param_value = param_access(param_number)
%#codegen
coder.varsize('param_number',[1 2]);
coder.varsize('param_value',[1 2]);
param_value = zeros(size(param_number));
The input "param_number" is a variable-sized signal coming in from Simulink. Both the input and the output are marked as "Variable Sized" in the MATLAB Function Block Port manager. The input seems to be handled OK. However, the output signal is persistently retruning an error like "Output 'param_value' (#1128) has variable size but the upper bound is not specified; explicit upper bound must be provided."
As you can see, I believe that I have specified an upper bound through the coder.varsize function, but Simulink doesn't seem to be accepting it for some reason.
I'm also getting another error like "Error in port widths or dimensions. Output port 1 of 'untitled/MATLAB Function/param_number' is a one dimensional vector with a maximum of 2 elements." This one's a little funny because "param_number" is the input, not the output, so I think this is related to the hidden behind-the-scenes way the MATLAB Function block is implemented. This error always attaches itself to the last input of the MATLAB Function block, whatever that is, even if that signal itself is not actually variable-sized and just has a fixed size of [1 1].

  0 Comments

Sign in to comment.

2 Answers

Answer by Ryan Livingston on 29 Apr 2014
 Accepted Answer

You should also set up the sizes in the Data Editor for the MATLAB Function Block as per:
So, in the editor for your MATLAB Function Block code click "Edit Data" and check the variable-size box for param_value and give [1 2] as the upper bound/size. Doing this alerts Simulink to the fact that the data should be variable-size.

  3 Comments

Hey, that works. Thanks!
I feel like I looked at about 50 different documentation pages that didn't mention that, but that page does.
Interesting notes for anyone else who might be reading this:
  • The coder.varsize commands within the MATLAB Function Block don't actually appear to be necessary if you've specified bounds in the port manager.
  • If you do specify coder.varsize commands, they have to match up with the sizes you specified in the port manager. For an output, which you have to specify a numerical upper bound, this is probably easy, but for an input that you've specified as having inherited (-1) size, you have to know what maximum size Simulink is going to determine for the signal.
In addition to that, if this output goes later to a "To Workspace" block, make sure that you set the "save format" field as structure or structure with time.
coder.varsize(...); is mandatory in the beginnng of the function if you dont add comment %codegen on the same line as function name
I wonder if this is a bug

Sign in to comment.


Answer by timo
on 18 Sep 2016

For the function bellow , y is variable size
function y = addEscapeCharacter(frameBytes, escapeCharacter, startOfFrame)
%codegen
finalArray = single([]);
coder.varsize('y',[1,10]);
if randi(2) ==1
finalArray = horzcat(single( [1 2 3 4 5 6 7 8 9]) , single([6]));
else
finalArray = horzcat(single( [1 2 3 4 5 6 7]), single([6]), single([1]));
end
y = single(finalArray);
This is mandatory coder.varsize('y',[1,10]); also click on Edit data button when editing the MATLAB function , select variable size and add uper and lower bounds as [val1, val2], so that means the y output can be an array of size val1 to val2

  0 Comments

Sign in to comment.