for
循环中 varargin
或 varargout
的非常量索引
问题
您的 MATLAB® 代码包含 for
循环,该循环对 varargin
或 varargout
进行索引。当您生成代码时,您会看到以下错误消息:
Non-constant expression or empty matrix.This expression must be constant because its value determines the size or class of some expression.(非常量表达式或空矩阵。此表达式必须为常量,因为其值用于确定某个表达式的大小或类。)
原因
在代码生成时,代码生成器必须能够确定 varargin
或 varargout
中的索引值。当在 for
循环中对 varargin
或 varargout
进行索引时,代码生成器通过展开循环来确定每个循环迭代的索引值。循环展开为每次循环迭代生成循环体的一个副本。在每次迭代中,代码生成器根据循环计数器确定索引的值。
在以下情况下,代码生成器无法确定 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