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