You cannot assign variable-size matrices to fixed-size matrices in
generated code. Consider this
example:
function Y = example_mismatch1(n) %#codegen
assert(n < 10);
B = ones(n,n);
A = magic(3);
A(1) = mean(A(:));
if (n == 3)
A = B;
end
Y = A;
Compiling this function produces this error:
??? Dimension 1 is fixed on the left-hand side
but varies on the right ...
There are several ways to fix this error:
Allow matrix A to grow by adding the
coder.varsize
construct:
function Y = example_mismatch1_fix1(n) %#codegen
coder.varsize('A');
assert(n < 10);
B = ones(n,n);
A = magic(3);
A(1) = mean(A(:));
if (n == 3)
A = B;
end
Y = A;
Explicitly restrict the size of matrix B to
3-by-3 by modifying the assert
statement:
function Y = example_mismatch1_fix2(n) %#codegen
coder.varsize('A');
assert(n == 3)
B = ones(n,n);
A = magic(3);
A(1) = mean(A(:));
if (n == 3)
A = B;
end
Y = A;
Use explicit indexing to make B the same
size as A:
function Y = example_mismatch1_fix3(n) %#codegen
assert(n < 10);
B = ones(n,n);
A = magic(3);
A(1) = mean(A(:));
if (n == 3)
A = B(1:3, 1:3);
end
Y = A;
If you assign an empty matrix [] to variable-size data,
MATLAB® might silently reshape the data in generated code to match a
coder.varsize specification. For example:
function Y = test(u) %#codegen
Y = [];
coder.varsize('Y', [1 10]);
if u < 0
Y = [Y u];
end
In this example, coder.varsize defines
Y as a column vector of up to 10 elements, so its
first dimension is fixed at size 1. The statement Y = []
designates the first dimension of Y as 0, creating a
mismatch. The right hand side of the assignment is an empty matrix and the
left hand side is a variable-size vector. In this case, MATLAB reshapes the empty matrix Y = [] in
generated code to Y = zeros(1,0) so it matches the
coder.varsize specification.
Diagnosing and Fixing Errors in Detecting Upper Bounds
You can define variable-size data by assigning a variable to a matrix with
nonconstant dimensions. For
example:
function y = dims_vary(u) %#codegenif (u > 0)
y = ones(3,u);
else
y = zeros(3,1);
end
However, compiling this function generates an error because you did not
specify an upper bound for u.
There are several ways to fix the problem:
Enable dynamic memory allocation and recompile. During code
generation, MATLAB does not check for upper bounds when it uses
dynamic memory allocation for variable-size data.
If you do not want to use dynamic memory allocation, add an
assert statement before the first use
of u:
function y = dims_vary_fix(u) %#codegen
assert (u < 20);
if (u > 0)
y = ones(3,u);
else
y = zeros(3,1);
end
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window.
Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.