Неконстантный индекс в 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

См. также

Похожие темы