Непостоянный индекс в 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 - цикл, генератор кода определяет индексное значение для каждой итерации цикла путем разворачивания цикла. Развертывание цикла делает копию тела цикла для каждой итерации цикла. В каждой итерации генератор кода определяет значение индекса от счетчика цикла.

Генератор кода не может определить значение индекса в 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

Смотрите также

Похожие темы

Была ли эта тема полезной?