for ループ内の varargin または varargout のインデックスが一定でない
問題
varargin または varargout にインデックス付けする for ループが MATLAB® コードに含まれています。コードを生成すると、次のエラー メッセージが表示されます。
定数でない式または空行列です。この式は、その値がいくつかの式のサイズ、またはクラスを定義するため、定数でなければなりません。
原因
コード生成時、コード ジェネレーターは varargin または varargout のインデックスの値を特定できなければなりません。varargin または varargout が for ループにインデックス付けされている場合、コード ジェネレーターは、ループを展開することで各ループ反復のインデックス値を特定します。ループ展開は、ループ反復のたびにループ本体のコピーを作成します。各反復において、コード ジェネレーターはインデックスの値をループ カウンターから特定します。
コード ジェネレーターは、次の場合に varargin または varargout のインデックスの値を特定できません。
ループ本体のコピーの数がループ展開の制限を超過している。
ヒューリスティックな方法では、ループ展開が特定の
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