varargin
или varargout
в a for
- ЦиклВаш код MATLAB® содержит a 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
индексируются в a for
- цикл, генератор кода определяет значение индекса для каждой итерации цикла путем разворачивания цикла. Развертывание цикла делает копию тела цикла для каждой итерации цикла. В каждой итерации генератор кода определяет значение индекса от счетчика цикла.
Генератор кода не может определить значение индекса в varargin
или varagout
когда:
Количество копий тела цикла превышает предельный разворачивающий цикл for.
Сбой эвристики, чтобы идентифицировать, что развертывание цикла гарантировано для детали 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