诊断和修复可变大小的数据错误
诊断和固定尺寸不匹配错误
问题:将可变大小矩阵分配给固定尺寸矩阵
您无法将可变大小矩阵分配给生成代码中的固定尺寸矩阵。考虑此示例:
功能y = example_mismatch1(n)%#codegen断言(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:));如果(n == 3)a = b;结尾y= A;
编译此功能会产生此错误:
???尺寸1固定在左侧,但在右侧变化...
There are several ways to fix this error:
允许矩阵
一个
通过添加编码器
construct:功能y = example_mismatch1_fix1(n)%#codegencoder.varsize('一个');断言(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:));如果(n == 3)a = b;结尾y= A;
明确限制矩阵的大小
b
通过修改3 x-3断言
陈述:功能y= example_mismatch1_fix2(n)%#codegencoder.varsize('一个');断言(n == 3)b =一个(n,n);a =魔术(3);a(1)=平均值(a(:));如果(n == 3)a = b;结尾y= A;
使用明确的索引来制作
b
大小与一个
:功能y = example_mismatch1_fix3(n)%#codegen断言(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:));如果(n == 3)a = b(1:3,1:3);结尾y= A;
问题:空矩阵重塑以匹配可变大小规范
如果您分配一个空矩阵[]
to variable-size data, MATLAB®可能会在生成的代码中默默地重塑数据以匹配编码器
规格。例如:
功能y =测试(u)%#codegeny = [];coder.varsize('y',[1 10]);如果u <0 y = [y u];结尾
在此示例中编码器
定义y
作为最多10个元素的列向量,因此其第一个维度固定在尺寸。y = []
指定的第一维y
AS 0,创建不匹配。分配的右侧是一个空矩阵,左侧是一个可变大小的向量。在这种情况下,MATLAB重塑空矩阵y = []
在生成的代码中y =零(1,0)
因此与编码器
规格。
问题:将隐式扩展的输出分配给固定尺寸变量
如果将二进制操作或函数的隐式扩展输出分配给不同大小的变量,则代码生成器可能会产生错误。例如:
功能out = test(n)%#codegenx =一个(n,1);如果mod(n,2) == 1 y = ones(n,n); x = y + x;结尾out = out + x(2);结尾
在此示例中X
是一个无限的向量。由于隐式扩展,加正操作X
andy
results in an unbounded matrix (Inf-by-Inf). Assigning an unbounded matrix toX
,这是一个无界向量,导致错误。
如果要使用隐式扩展的输出,请将输出分配给具有与输出相同的新变量。
If you want x to retain its size and not apply implicit expansion in the generated code, usecoder.sameSizeBinaryOp
(MATLAB编码器)应用操作。你也可以打电话coder.noImplicitExpansionInFunction
(MATLAB编码器)在您的功能体系中,禁用为该功能生成的代码中隐含扩展。
Implicit expansion automatically expands the operands to apply binary operations on arrays of compatible sizes. See启用具有隐式扩展的代码(MATLAB编码器),,,,优化生成代码中的隐式扩展(MATLAB编码器), 和兼容阵列大小用于基本操作。
诊断和修复错误检测上Bo你nds
问题:在矩阵构造函数中使用非恒定尺寸
您可以通过将变量分配给具有非恒定尺寸的矩阵来定义可变大小数据。例如:
功能y = dims_vary(u)%#codegen如果(u> 0)y =一个(3,u);别的y =零(3,1);结尾
但是,编译此功能会生成错误,因为您没有指定上限你
。
要解决问题,请添加断言
首次使用之前的声明你
:
功能y = dims_vary_fix(u)%#codegen断言(u <20);如果(u> 0)y =一个(3,u);别的y =零(3,1);结尾