Main Content

解决错误:大小不匹配

问题

当数组大小不兼容或隐式扩展不可用时,代码生成器会产生大小不匹配错误。

MATLAB® 中的大多数二元运算符和函数以及生成的代码都支持大小兼容的数值数组。对于每个维度,如果两个输入的大小相同或其中一个为 1,则这些输入将具有兼容的大小。以最简单的情况为例,如果两个数组大小完全相同或其中一个为标量,则这两个数组大小是兼容的。例如:

magic(4) + ones(4,1);
% where magic(4) =             ones(4,1)  = 
%   16     2     3    13                    1
%    5    11    10     8                    1
%    9     7     6    12                    1
%    4    14    15     1                    1
ans =

    17     3     4    14
     6    12    11     9
    10     8     7    13
     5    15    16     2

第二个数组会隐式扩展以匹配第一个矩阵的维度。有关详细信息,请参阅基本运算的兼容数组大小

在对兼容大小的数组执行二元运算时,如果满足以下任一条件,隐式扩展可能不可用:

隐式扩展的大小不匹配或不可用会生成以下错误:

%Size mismatch between two arrays
Size mismatch (size [10][1] ~= size [1][10])

当结构体字段和元胞元素满足上述条件时,代码生成器将分别生成以下错误:

%Size mismatch in structure fields
Size mismatch (size [10][1] ~= size [1][10]) in field StructField

%Size mismatch in cell elements
Size mismatch (size [10][1] ~= size [1][10]) in element cellElement.

可能的解决方案

验证在支持隐式扩展的二元运算中,运算是否在函数作用域内。检查是否存在以下情况:

  • 数组大小不兼容。

  • 在调用 coder.noImplicitExpansionInFunction 的函数的作用域内进行二元运算。

  • coder.sameSizeBinaryOp 不隐式扩展其操作数或支持标量扩展。

  • 如果您关闭了整个工程的隐式扩展,所有需要隐式扩展的运算都会生成错误。

对兼容大小的数组执行二元运算

如果必须对不同大小的数组执行二元运算,请确保数组的大小兼容,并且在函数作用域内启用了隐式扩展。请参阅基本运算的兼容数组大小

在没有 coder.noImplicitExpansionInFunction 的情况下调用二元运算

如果必须在您的函数中包含 coder.noImplicitExpansionInFunction,请在另一个启用隐式扩展的函数中调用所需的二元运算。

在没有 coder.sameSizeBinaryOp 的情况下调用二元运算

如果不希望对特定运算启用隐式扩展,请提供与 coder.sameSizeBinaryOp 大小相同的输入参数。coder.sameSizeBinaryOp 不允许标量扩展,如果输入参数的大小不同,则会生成错误。

对工程启用隐式扩展

如果启用隐式扩展不影响您的工程,请考虑通过将代码配置对象中的 EnableImplicitExpansion 属性设置为 true 来启用隐式扩展。

如果您需要对特定运算启用隐式扩展,请考虑使用 coder.sameSizeBinaryOpcoder.noImplicitExpansionInFunction 来防止其他运算发生隐式扩展。请参阅Optimize Implicit Expansion in Generated Code

另请参阅

|

相关主题