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