Появится одно из следующих сообщений:
Unable to determine that every element of 'y' is assigned before this line.
Unable to determine that every element of 'y' is assigned before exiting the function.
Unable to determine that every element of 'y' is assigned before exiting the recursively called function.
Для создания кода перед использованием элемента массива ячеек необходимо присвоить ему значение. При использовании cell для создания массива ячеек переменного размера, например, cell(1,n)MATLAB ® назначает пустую матрицу каждому элементу. Однако для генерации кода элементы не назначаются. Для создания кода после использованияcell для создания массива ячеек переменного размера перед использованием массива ячеек необходимо назначить все элементы массива ячеек.
Генератор кода анализирует код, чтобы определить, назначены ли все элементы до первого использования массива ячеек. Генератор кода обнаруживает, что все элементы назначены, когда код следует этому шаблону:
function z = CellVarSize1D(n, j) %#codegen assert(n < 100); x = cell(1,n); for i = 1:n x{i} = i; end z = x{j}; end
Вот шаблон для многомерного массива ячеек:
function z = CellAssign3D(m,n,p) %#codegen assert(m < 100); assert(n < 100); assert(p < 100); x = cell(m,n,p); for i = 1:m for j =1:n for k = 1:p x{i,j,k} = i+j+k; end end end z = x{m,n,p}; end
Если генератор кода обнаруживает, что некоторые элементы не назначены, генерация кода завершается неуспешно. Иногда, даже если код присваивает все элементы массива ячеек, создание кода не удается, поскольку анализ не обнаруживает, что все элементы назначены.
Вот примеры, когда генератор кода не может обнаружить, что элементы назначены:
Элементы назначаются в различных контурах
... x = cell(1,n) for i = 1:5 x{i} = 5; end for i = 6:n x{i} = 7; end ...
Переменная, определяющая значение конца цикла, не совпадает с переменной, определяющей размер ячейки.
... x = cell(1,n); m = n; for i = 1:m x{i} = 2; end ...
Дополнительные сведения см. в разделе Определение массива ячеек переменного размера с помощью ячейки.
Попробуйте одно из следующих решений:
Если возможно, перепишите код, чтобы следовать этому шаблону:
... x = cell(1,n); for i = 1:n x{i} = i; end z = x{j}; ...
repmatИногда можно использовать repmat для определения массива ячеек переменного размера.
Рассмотрим этот код, определяющий массив ячеек переменного размера. Он присваивает значение 1 нечетным элементам, а значение 2 четным элементам.
function z = repDefine(n, j) %#codegen assert(n < 100); c =cell(1,n); for i = 1:2:n-1 c{i} = 1; end for i = 2:2:n c{i} = 2; end z = c{j};
Создание кода не позволяет использовать этот код по следующей причине:
Элементы назначаются несколькими контурами.
Счетчик цикла не увеличивается на 1.
Перезаписать код для первого использования cell для создания массива ячеек 1 на 2, первый элемент которого равен 1, а второй элемент равен 2. Затем используйте repmat для создания массива ячеек переменного размера, значения элементов которого чередуются между 1 и 2.
function z = repVarSize(n, j) %#codegen assert(n < 100); c = cell(1,2); c{1} = 1; c{2} = 2; c1= repmat(c,1,n); z = c1{j}; end
Первоначально пустой массив ячеек переменного размера можно передать в функцию или из нее с помощью repmat. Используйте следующий шаблон:
function x = emptyVarSizeCellArray x = repmat({'abc'},0,0); coder.varsize('x'); end
Этот код указывает, что x является пустым массивом ячеек переменного размера 1x3 символы, которые могут передаваться в функции или из них.
coder.nullcopyВ крайнем случае, вы можете использовать coder.nullcopy указывает, что генератор кода может выделить память для массива ячеек без инициализации памяти. Например:
function z = nulcpyCell(n, j) %#codegen assert(n < 100); c =cell(1,n); c1 = coder.nullcopy(c); for i = 1:4 c1{i} = 1; end for i = 5:n c1{i} = 2; end z = c1{j}; end
Использовать coder.nullcopy с осторожностью. При доступе к неинициализированной памяти результаты непредсказуемы.
cell | coder.nullcopy | repmat