Main Content

for 루프에서 varargin 또는 varargout에 대한 인덱스가 상수가 아닌 경우

문제

다음 MATLAB® 코드에 varargin 또는 varargout의 요소를 참조하는 for 루프가 포함되어 있습니다. 코드 생성 시 다음 오류 메시지가 표시됩니다.

Non-constant expression or empty matrix. This expression
must be constant because its value determines the size
or class of some expression.

원인

코드 생성기는 코드 생성 시점에 varargin 또는 varagout에 대한 인덱스 값을 확인할 수 있어야 합니다. for 루프에서 varargin 또는 varagout의 요소를 참조하는 경우, 코드 생성기는 해당 루프를 풀어서 각 루프 반복마다 인덱스 값을 확인합니다. 루프를 풀면 각 루프 반복마다 루프 본문 복사본이 생성됩니다. 코드 생성기는 각 반복마다 루프 카운터를 통해 인덱스 값을 확인합니다.

다음과 같은 경우 코드 생성기는 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

참고 항목

관련 항목