主要内容

诊断和修复适应可变数据错误

诊断和修复尺寸不匹配错误

问题:分配固定大小的矩阵适应矩阵

你不能适应矩阵分配给固定大小的矩阵生成的代码。考虑一下这个例子:

函数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 =;

  • 明确限制大小的矩阵B3×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定义了Y10的一个列向量的元素,所以它的第一个维度是固定尺寸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是一个无界的向量。由于隐式扩张,加上操作xy结果在一个无限矩阵(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);结束