潜在的差异信息
当你使潜在的差异报告,代码生成器报告潜在的差异生成的代码的行为和MATLAB的行为®代码。审查和解决潜在差异生成独立的代码之前帮助你避免在生成的代码错误和不正确的答案。
这里有一些消息:潜在的差异
自动尺寸不相容
在生成的代码中,操作维度以及自动选择,可能不同于MATLAB。考虑指定工作维度明确作为一个常数值。
这一限制适用于函数,把工作维度(维度以及经营)作为输入。在MATLAB和代码生成,如果你不提供工作尺寸,功能选择。在MATLAB函数选择的第一个维度尺寸不等于1。代码生成的函数选择的第一个维度变量大小或有固定大小不等于1。如果工作维度变量的大小和它在运行时变成1,然后工作尺寸不同于MATLAB工作尺寸。因此,当启用运行时错误检查时,会出现一个错误。
例如,假设X
是一个适应矩阵维度1 x: 3 x: 5
。在生成的代码中,总和(X)
表现得像总和(X, 2)
。在MATLAB中,总和(X)
表现得像总和(X, 2)
除非大小(X, 2)
是1。在MATLAB中,当大小(X, 2)
是1,总和(X)
表现得像总和(X, 3)
。
为了避免这个问题,显式地指定目标维度工作作为一个常数值。例如,总和(X, 2)
。
mtimes没有动态标量扩张
生成的代码执行一个通用的矩阵乘法。如果一个适应矩阵操作成为一个标量在运行时,尺寸必须同意。不会有一个自动切换到标量乘法。
考虑到乘法A * B
。如果代码生成器是意识到一个
是标量,B
是一个矩阵,代码生成器生成的代码为标量矩阵乘法。但是,如果代码生成器是意识到一个
和B
是适应矩阵,它产生的代码对于一般的矩阵乘法。在运行时,如果一个
原来是标量,生成的代码并没有改变其行为。因此,当启用运行时错误检查时,可能出现失配误差大小。
矩阵与矩阵的索引
索引矩阵与矩阵,matrix1 (matrix2),代码生成器认为结果会matrix2一样的大小。如果matrix1和matrix2向量在运行时,他们的方向必须匹配。
在矩阵与矩阵的索引,您可以使用一个矩阵指数到另一个矩阵。在MATLAB中,索引矩阵与矩阵的一般规则是,结果的大小和方向匹配指数矩阵的大小和方向。例如,如果一个
和B
矩阵,大小((B))
=大小(B)
。当一个
和B
是向量,MATLAB应用一种特殊的规则。特殊的向量索引规则是结果的方向是数据的方向矩阵。例如,如果一个
1-by-5和B
3×1,那么(B)
1×3。
代码生成器应用MATLAB矩阵与矩阵索引规则一样。如果一个
和B
是适应矩阵,应用矩阵与矩阵索引规则,代码生成器假设大小((B))
=大小(B)
。在运行时,如果一个
和B
成为向量和有不同的取向,那么假设是不正确的。因此,当启用运行时错误检查时,会出现一个错误。
为了避免这个问题,迫使你的数据索引向量进行结肠操作。例如,假设您的代码故意在运行时向量和正则矩阵之间进行切换。你可以做一个显式检查向量索引。
…如果& & isvector isvector (A) (B) C = (:);D = C (B (:));其他的D = (B);结束…
第一个分支指定的索引C
和B (:)
是编译时向量。因此,代码生成器索引的索引规则适用于一个向量与另一个向量。结果的方向是数据的方向向量,C
。
向量索引
索引向量与向量,vector1 (vector2),代码生成器认为结果会与vector1相同的取向。如果vector1在运行时是一个标量,vector2必须匹配vector1的取向。
在MATLAB中,向量索引的特殊规则是结果的方向向量的方向数据。例如,如果一个
1-by-5和B
3×1,那么(B)
1×3。然而,如果数据向量一个
是一个标量,那么的方向(B)
索引向量的方向吗B
。
代码生成器适用相同的向量索引规则是MATLAB。如果一个
和B
适应可变向量,应用索引规则,代码生成器假设的方向B
匹配的方向一个
。在运行时,如果一个
标量的方向吗一个
和B
不匹配,那么假设是不正确的。因此,当启用运行时错误检查,可能出现一个运行时错误。
为了避免这个问题,使方向的向量匹配。另外,指标单一元素指定行和列。例如,(行、列)
。
循环索引溢出
生成的代码假设循环指数不溢出的最后迭代循环。如果循环指数溢出,无限循环可以发生。
假设一个为
循环结束值等于或接近最大值或最小值的循环索引的数据类型。在生成的代码中,循环的最后一个盈亏指数可能导致索引变量溢出。该指数溢出可能导致无限循环。
当启用内存完整性检查,如果代码生成器检测到循环指数可能会溢出,它会报告错误。软件错误检查是保守的。它可能错误地报告一个循环指数溢出。默认情况下,memory-integrity检查为墨西哥人代码启用和禁用独立的C / c++代码。看到为什么测试墨西哥人在MATLAB函数吗?和生成独立的C / c++代码检测和报告运行时错误。
为了避免循环指数溢出,使用这个表中的解决方法。
循环条件造成潜在的溢出 | 解决方案 |
---|---|
|
如果循环没有覆盖整个范围的整数类型,重写循环,最终值不等于最大值的整数类型。例如,替换: N = intmax (k = N-10 int16): N k = 1:10 |
|
如果循环没有覆盖整个范围的整数类型,重写循环,最终值的最小值不等于整数类型。例如,替换: N = intmin (int32) k = N + 10: 1: N k = 10: 1:1 |
|
如果循环必须覆盖整个范围的整数类型,循环的类型开始,一步,和结束值更大的整数或翻倍。例如,重写: M = intmin (“int16”);N = intmax (“int16”);k = M: N %循环体 M = intmin (“int16”);N = intmax (“int16”);k = int32 (M): int32 (N) %循环体 |
|
重写循环,循环指数在过去的循环迭代结束等于价值。 |