varargin или varargout в for- ПетляКод MATLAB ® содержит for-loop, который индексирует в varargin или varargout. При создании кода появляется следующее сообщение об ошибке:
Non-constant expression or empty matrix. This expression must be constant because its value determines the size or class of some expression.
Во время генерации кода генератор кода должен иметь возможность определять значение индекса в varargin или varagout. Когда varargin или varagout индексируются в for-loop, генератор кода определяет значение индекса для каждой итерации цикла, развернув цикл. При разворачивании цикла создается копия тела цикла для каждой итерации цикла. В каждой итерации генератор кода определяет значение индекса из счетчика циклов.
Генератору кода не удается определить значение индекса в varargin или varagout когда:
Число копий тела цикла превышает предельное значение для разматывания цикла.
Эвристика не может определить, что разукрупнение цикла является оправданным для конкретного for-луп. Например, рассмотрим следующую функцию:
function [x,y,z] = fcn(a,b,c) %#codegen [x,y,z] = subfcn(a,b,c); function varargout = subfcn(varargin) j = 0; for i = 1:nargin j = j+1; varargout{j} = varargin{j}; end
Эвристика не обнаруживает связь между индексом j и счетчик контуров i. Поэтому генератор кода не разворачивает for-луп.
Используйте одно из следующих решений:
Принудительное разворачивание контура с помощью coder.unroll. Например:
function [x,y,z] = fcn(a,b,c) %#codegen [x,y,z] = subfcn(a,b,c); function varargout = subfcn(varargin) j = 0; coder.unroll(); for i = 1:nargin j = j + 1; varargout{j} = varargin{j}; end
Перезаписать код так, чтобы генератор кода мог обнаружить взаимосвязь между индексом и счетчиком цикла. Например:
function [x,y,z] = fcn(a,b,c) %#codegen [x,y,z] = subfcn(a,b,c); function varargout = subfcn(varargin) for i = 1:nargin varargout{i} = varargin{i}; end