varargin
или varargout
в for
- ЦиклВаш MATLAB® код содержит for
-цикл, который индексируется в 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