诊断和修复适应可变数据错误
诊断和修复尺寸不匹配错误
问题:分配固定大小的矩阵适应矩阵
你不能适应矩阵分配给固定大小的矩阵生成的代码。考虑一下这个例子:
函数Y = example_mismatch1 (n)% # codegen断言(n < 10);B = 1 (n, n);一个=魔法(3);(1)=意味着((:));如果(n = = 3) A = B;结束Y =;
编译这个函数产生这个错误:
? ? ?维度1固定在左边右边但不同……
有几种方法可以解决这个错误:
允许矩阵
一个
通过添加生长coder.varsize
构造:函数Y = example_mismatch1_fix1 (n)% # codegencoder.varsize (“一个”);断言(n < 10);B = 1 (n, n);一个=魔法(3);(1)=意味着((:));如果(n = = 3) A = B;结束Y =;
明确限制大小的矩阵
B
3×3通过修改断言
声明:函数Y = example_mismatch1_fix2 (n)% # codegencoder.varsize (“一个”);断言(n = = 3) B = 1 (n, n);一个=魔法(3);(1)=意味着((:));如果(n = = 3) A = B;结束Y =;
使用显式的索引
B
一样的大小一个
:函数Y = example_mismatch1_fix3 (n)% # codegen断言(n < 10);B = 1 (n, n);一个=魔法(3);(1)=意味着((:));如果(n = = 3) A = B (1:3, 1:3);结束Y =;
问题:空矩阵重塑适应规范相匹配
如果你指定一个空矩阵[]
来适应数据,MATLAB®会默默地重塑中的数据生成的代码匹配coder.varsize
规范。例如:
函数Y =测试(u)% # codegenY = [];coder.varsize (“Y”10 [1]);如果u < 0 Y = [Y u];结束
在这个例子中,coder.varsize
定义了Y
10的一个列向量的元素,所以它的第一个维度是固定尺寸1。该声明Y = []
指定的第一个维度Y
为0,创造一个不匹配。右边的赋值是一个空矩阵和左边是一个适应可变向量。在这种情况下,MATLAB重塑空矩阵Y = []
在生成的代码Y = 0 (1,0)
所以它匹配coder.varsize
规范。
问题:将隐式地扩大输出分配给固定大小的变量
如果你分配的隐式地扩大输出二进制操作的变量或函数不同大小、代码生成器可能产生一个错误。例如:
函数=测试(n)% # codegenx = 1 (n, 1);如果国防部(n, 2) = = 1 y = 1 (n, n);x = y + x;结束= + x (2);结束
在这个例子中,x
是一个无界的向量。由于隐式扩张,加上操作x
和y
结果在一个无限矩阵(Inf-by-Inf)。分配一个无界的矩阵x
,这是一个无限的向量,会导致错误。
如果你想使用隐式地扩大输出,输出分配给一个新的变量具有相同的大小作为输出。
如果你想让x保留其大小和不适用隐式扩张在生成的代码中,使用coder.sameSizeBinaryOp
应用操作。你也可以叫coder.noImplicitExpansionInFunction
函数体中禁用隐式扩张函数所生成的代码。
隐式扩张自动扩展操作数应用二进制兼容数组大小的操作。看到生成代码启用了隐式的扩张,在生成的代码优化隐式扩张,兼容数组大小的基本操作。
诊断和修复错误检测上界
问题:在一个矩阵构造函数使用非常数的维度
您可以通过指定一个变量定义适应可变数据和非常数的矩阵维度。例如:
函数y = dims_vary (u)% # codegen如果(u > 0) y = 1 (3 u);其他的y = 0 (3,1);结束
然而,编译这个函数生成一个错误,因为你没有指定一个上界u
。
有几种方法可以解决这个问题:
启用动态内存分配和编译。在代码生成,MATLAB时不检查上界为适应可变数据使用动态内存分配。
如果你不想使用动态内存分配时,添加一个
断言
第一次使用之前声明u
:函数y = dims_vary_fix (u)% # codegen断言(u < 20);如果(u > 0) y = 1 (3 u);其他的y = 0 (3,1);结束