Main Content

for ループ内の varargin または varargout のインデックスが一定でない

問題

varargin または varargout にインデックス付けする for ループが MATLAB® コードに含まれています。コードを生成すると、次のエラー メッセージが表示されます。

定数でない式または空行列です。この式は、その値が
いくつかの式のサイズ、またはクラスを定義するため、
定数でなければなりません。

原因

コード生成時、コード ジェネレーターは varargin または varagout のインデックスの値を特定できなければなりません。varargin または varagoutfor ループにインデックス付けされている場合、コード ジェネレーターは、ループを展開することで各ループ反復のインデックス値を特定します。ループ展開は、ループ反復のたびにループ本体のコピーを作成します。各反復において、コード ジェネレーターはインデックスの値をループ カウンターから特定します。

コード ジェネレーターは、次の場合に 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

参考

関連するトピック