exponenta event banner

Несоответствующий индекс в 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

См. также

Связанные темы