主要内容

for 循环中 vararginvarargout 的非常量索引

问题

您的 MATLAB® 代码包含 for 循环,该循环对 vararginvarargout 进行索引。当您生成代码时,您会看到以下错误消息:

Non-constant expression or empty matrix.This expression must be constant because its value determines the size or class of some expression.(非常量表达式或空矩阵。此表达式必须为常量,因为其值用于确定某个表达式的大小或类。)

原因

在代码生成时,代码生成器必须能够确定 vararginvarargout 中的索引值。当在 for 循环中对 vararginvarargout 进行索引时,代码生成器通过展开循环来确定每个循环迭代的索引值。循环展开为每次循环迭代生成循环体的一个副本。在每次迭代中,代码生成器根据循环计数器确定索引的值。

在以下情况下,代码生成器无法确定 vararginvarargout 中的索引值:

  • 循环体的副本数超出循环展开的限制。

  • 启发式方法无法确定是否一定会对特定 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

另请参阅

主题