Coder varsize unbounded second dimension

5 vues (au cours des 30 derniers jours)
Maria
Maria le 25 Nov 2020
Commenté : Maria le 25 Nov 2020
Hi,
I am reading on the Matlab help about coder.varsize. In particular, I read that
Declare Variable-Size Array with a Mix of Fixed and Variable Dimensions
Specify that A is an array whose first dimension has a fixed size of three and whose second dimension has a variable size with an upper bound of 20.
function fcn()
...
coder.varsize('A',[3 20], [0 1] );
...
end
I am not sure I understand how to fix the first dimension, but declaring the second dimension as "Inf", so no upperbound at all.
From what I understand here, I always need to give an upperbound, when I have a mix of fixed and variable dimensions. Is that correct, or there is a way to fix one dimension, and specify the second dimension as unbounded?

Réponse acceptée

Darshan Ramakant Bhat
Darshan Ramakant Bhat le 25 Nov 2020
I will try to explain with an example.
What does it mean by fixed dimesion ? Consider below example
function [x,y] = usevarsize(n)
%#codegen
x = 1;
%x = ones(2);
coder.varsize('x',[1 12],[0 1]);
y = size(x);
if n > 10
x = 1:n;
end
Here variable can have dimension as '1x:12'. It means 'x' can be 2, [3,4], [1,3,5] .... [1,2...12]. So x can be any 1-D array till lenght 12.
If you had declared 'x' as coder.varsize('x',[2 12],[0 1]); then 'x' can be any 2xm matrix, where m can vary from 1 to 12.
Verify this behavior using the mex :
codegen usevarsize -args {0} -report
>> usevarsize_mex(11)
ans =
1 2 3 4 5 6 7 8 9 10 11
>> usevarsize_mex(14)
Error using usevarsize (line 8)
Size overflow error on dimension 2: upper bound is 12, but actual size is 14.
Should you always specify upperbound for the second dimension when the first is fixed ?
Not necessarily. Consider below example
function [x,y] = usevarsize(n)
%#codegen
x = 1;
%x = ones(2);
coder.varsize('x',[1 inf],[0 1]);
y = size(x);
if n > 10
x = 1:n;
end
Here I am declaring the second dimension of 'x' as unbounded. So 'x' can be any length 1-D vector :
codegen usevarsize -args {0} -report
>> usevarsize_mex(24)
ans =
Columns 1 through 22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Columns 23 through 24
23 24
What is the difference between specifying an upperbound & unbounded case
When the upperbound is not known (unbounded) then the generated code may not be very much performant since it may have to do heap memory allocations. When the upper bounds are known, data can be stack allocated, so the code will be more performant. Also the MATLAB Coder can do additional optimizations when the upperbounds are known.
Hope this will give you more clarity.
  1 commentaire
Maria
Maria le 25 Nov 2020
Perfect answer, I understood! I did not know I could use "inf" in the matlab code.
I will try using upperbounds whenever possible.
Thanks!!

Connectez-vous pour commenter.

Plus de réponses (0)

Produits


Version

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by