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.