Генератор кода классифицирует массив ячеек переменного размера как однородный. Элементы массива ячеек должны иметь одинаковый класс. В сгенерированном коде массив ячеек представлен как массив.
Чтобы сделать массив ячеек переменным размером:
Создайте массив ячеек при помощи cell функция. Для примера:
function z = mycell(n, j) %#codegen assert (n < 100); x = cell(1,n); for i = 1:n x{i} = i; end z = x{j}; end
Для генерации кода, когда вы создаете массив ячеек переменного размера при помощи cell, вы должны придерживаться определенных ограничений. См. Определение массива ячеек переменного размера при помощи камеры.
Вырастите массив ячеек. Для примера:
function z = mycell(n) %#codegen c = {1 2 3}; if n > 3 c = {1 2 3 4}; end z = c{n}; end
Заставьте массив ячеек иметь переменный размер при помощи coder.varsize. Рассмотрим этот код:
function y = mycellfun() %#codegen c = {1 2 3}; coder.varsize('c', [1 10]); y = c{1}; end
Без coder.varsize, c фиксированный размер с размерностями 1 на 3. С coder.varsize, c является переменным размером с верхней границей 10.
Иногда, используя coder.varsize изменяет классификацию массива ячеек с неоднородной на однородную. Рассмотрим этот код:
function y = mycell() %#codegen c = {1 [2 3]}; y = c{2}; end
Генератор кода классифицирует c как неоднородный, поскольку элементы имеют разные размеры. c фиксированный размер с размерностями 1 на 2. Если вы используете coder.varsize с c, он становится однородным. Для примера:
function y = mycell() %#codegen c = {1 [2 3]}; coder.varsize('c', [1 10], [0 1]); y = c{2}; end
c становится однородным массивом ячеек переменного размера с размерностями 1-by-: 10.
Для принудительного c чтобы быть однородным, но не переменным размером, задайте, что ни одна из размерностей не изменяется. Для примера:
function y = mycell() %#codegen c = {1 [2 3]}; coder.varsize('c', [1 2], [0 0]); y = c{2}; end