主要内容

不兼容的MATLAB在适应支持代码生成金宝app

不兼容,MATLAB标量扩张

标量扩张是一个标量数据的转换方法来匹配向量或矩阵数据的维度。如果一个操作数是一个标量,另一个不是,标量扩张标量适用于每个元素的其他操作数。

在代码生成过程中,标量扩展规则适用除非操作在两个适应表达式。在这种情况下,两个操作数必须是相同的大小。生成的代码不执行标量扩张即使一个适应表达式在运行时是标量。因此,当启用运行时错误检查,可能出现一个运行时错误。

考虑一下这个函数:

函数y = scalar_exp_test_err1 (u)% # codegeny = 1 (3);开关u情况下0 z = 0;情况下1 z = 1;否则z = 0 (3);结束y (:) = z;

当你为这个函数生成的代码,代码生成器决定z是可变大小的上限3

这张图片显示了函数scalar_exp_test_err1报告。z是适应的上限3,如大小列示。旁边的分号每个维度表示维度是适应。

如果你运行的墨西哥人的功能u等于0或1,生成的代码不执行标量扩张,尽管z在运行时是标量。因此,当启用运行时错误检查,可能出现一个运行时错误。

scalar_exp_test_err1_mex(0)下标赋值尺寸不匹配:[9]~ = [1]。错误scalar_exp_test_err1(11)行y (:) = z;

为了避免这个问题,使用索引z是一个标量值。

函数y = scalar_exp_test_err1 (u)% # codegeny = 1 (3);开关u情况下0 z = 0;情况下1 z = 1;否则z = 0 (3);结束y z (,) = (1);

不兼容,MATLAB在确定的大小适应一天数组

为适应一天数组大小函数可以返回不同的结果比MATLAB生成的代码®。在生成的代码中,大小(一个)返回一个固定长度的输出,因为它不掉落后于单维度的适应一天数组。相比之下,大小(一个)在MATLAB返回一个变长输出,因为它落后于单维度下降。

例如,如果数组的形状一个:x: x: ?大小(3)= = 1,大小(一个)返回:

  • 三元素向量生成的代码

  • 双元素向量在MATLAB代码

解决方法

如果您的应用程序需要生成的代码返回相同的大小适应一天数组作为MATLAB代码,考虑其中一个解决方法:

  • 使用的双参数形式大小

    例如,大小(n),返回相同的答案生成的代码和MATLAB代码。

  • 重写大小(一个):

    B =大小(一个);X = B (1: ndims (A));

    这个版本的回报X用变长输出。然而,你不能通过适应X矩阵构造函数等0需要一个固定大小的参数。

不兼容,MATLAB在确定空数组的大小

在代码生成一个空数组的大小可能不同于它的大小在MATLAB源代码。大小可能1 x00 x1在生成的代码,但是0 x0在MATLAB。因此,你不应该编写代码依赖于特定大小的空矩阵。

例如,考虑下面的代码:

函数y = foo (n)% # codegenx = [];我= 0;(我< 10)x = x [5];我=我+ 1;结束如果n > 0 x = [];结束y =大小(x);结束

连接要求其操作数的大小尺寸相匹配,后者是没有连接。在前面的串联,标量值的大小1 x1x有大小0 x0。为了支金宝app持这个用例,代码生成器决定了大小x作为(1 x: ?)。因为还有另外一个任务x = []连接后的大小x在生成的代码中1 x0而不是0 x0

这种行为持续而确定空字符的大小表示为向量。例如,考虑下面的代码:

函数出= string_size =大小();结束

这里的价值可能是1 x00 x1在生成的代码,但是0 x0在MATLAB。

不兼容的MATLAB在决定一个空数组的大小,删除数组元素,结果看到的删除空数组的大小,结果数组的元素

解决方案

如果您的应用程序检查是否一个矩阵是空的,使用其中一个解决方法:

  • 重写代码使用isempty函数而不是大小函数。

  • 而不是使用x = []创建空数组,建立空数组的具体尺寸,使用0。例如:

    函数y = test_empty (n)% # codegenx = 0 (1,0);我= 0;(我< 10)x = x [5];我=我+ 1;结束如果n > 0 x = 0 (1,0);结束y =大小(x);结束

不兼容,MATLAB在确定类的空数组

一个空数组的类生成的代码可以从它的类不同的MATLAB源代码。因此,不写代码依赖于空矩阵的类。

例如,考虑下面的代码:

函数y =乐趣(n) x = [];如果n > 1 x = (“一个”x];结束y =类(x);结束
有趣的(0)返回在MATLAB,但字符在生成的代码。当声明n > 1MATLAB是假的,不执行x = x [a]。的类x,空数组的类。然而,代码生成器认为所有的执行路径。它决定了基于声明x = x [a]的类x字符

解决方案

而不是使用x = []创建一个空数组,数组创建一个空的一个特定的类。例如,使用空白(0)创建一个空数组的字符。

函数y =乐趣(n) x =空白(0);如果n > 1 x = (“一个”x];结束y =类(x);结束

不兼容,MATLAB在矩阵与矩阵的索引

在矩阵与矩阵的索引,您可以使用一个矩阵指数到另一个矩阵。在MATLAB中,索引矩阵与矩阵的一般规则是,结果的大小和方向匹配指数矩阵的大小和方向。例如,如果一个B矩阵,大小((B))=大小(B)。当一个B是向量,MATLAB应用一种特殊的规则。特殊的向量索引规则是结果的方向是数据的方向矩阵。例如,如果一个1-by-5和B3×1,那么(B)1×3。

代码生成器应用MATLAB矩阵与矩阵索引规则一样。如果一个B是适应矩阵,应用矩阵与矩阵索引规则,代码生成器假设大小((B))=大小(B)。在运行时,如果一个B成为向量和有不同的取向,那么假设是不正确的。因此,当启用运行时错误检查时,会出现一个错误。

为了避免这个问题,迫使你的数据索引向量进行结肠操作。例如,假设您的代码故意在运行时向量和正则矩阵之间进行切换。你可以做一个显式检查向量索引。

如果& & isvector isvector (A) (B) C = (:);D = C (B (:));其他的D = (B);结束

第一个分支指定的索引CB (:)是编译时向量。因此,代码生成器索引的索引规则适用于一个向量与另一个向量。结果的方向是数据的方向向量,C

不兼容,MATLAB在向量索引

在MATLAB中,向量索引的特殊规则是结果的方向向量的方向数据。例如,如果一个1-by-5和B3×1,那么(B)1×3。然而,如果数据向量一个是一个标量,那么的方向(B)索引向量的方向吗B

代码生成器适用相同的向量索引规则是MATLAB。如果一个B适应可变向量,应用索引规则,代码生成器假设的方向B匹配的方向一个。在运行时,如果一个标量的方向吗一个B不匹配,那么假设是不正确的。因此,当启用运行时错误检查,可能出现一个运行时错误。

为了避免这个问题,使方向的向量匹配。另外,指标单一元素指定行和列。例如,(行、列)

不兼容,MATLAB在矩阵索引操作代码生成

以下限制适用于矩阵索引操作代码生成:

  • 初始化以下风格:

    我= 1:10 M (i) = 5;结束

    在这种情况下,的大小执行循环变化。代码生成不支持增加一个数组的大小。金宝app

    对于代码生成,preallocate

    M = 0 (10);我= 1:10 M (i) = 5;结束

以下限制适用于矩阵索引操作代码生成禁用动态内存分配时:

  • M (i, j)在哪里j一个循环的变化

    在代码生成过程中,记忆不是动态分配大小的表达式,改变程序执行。要实现这一行为,使用对- - - - - -循环如图所示:

    M = 1 (10,10);i = 1:10j =我:10 M (i, j) = 2 * M (i, j);结束结束

    请注意

    矩阵必须定义在进入循环。

不兼容,MATLAB在连接适应矩阵

代码生成,当你将适应可变数组的维度并没有被连接必须完全匹配。

差异在大括号内细胞适应可变数组的索引连接不返回任何元素

假设:

  • c是一个适应细胞数组。

  • 您访问的内容c通过使用花括号。例如,c {2:4}

  • 你在连接包括结果。例如,(c {2:4} b)

  • c{我}没有返回任何元素。要么c为空或者花括号内的索引生成一个空的结果。

这些条件,MATLAB省略了c{我}从连接。例如,(c{我}b)就变成了[b]。代码生成器处理c{我}随着空数组[c{我}]。连接变得[c{我}][……]。这个连接然后省略了数组[c{我}]。这样的属性[c{我}]兼容是连接吗[c{我}][……],代码生成器指定类、大小和复杂性[c{我}]根据这些规则:

  • 类和复杂性是一样的细胞的基本类型数组。

  • 第二维度的大小总是0。

  • 剩下的尺寸,大小的取决于相应的维度的基本类型是固定的或可变大小。

    • 如果基类中相应的维度是可变大小、尺寸大小0的结果。

    • 如果基类中相应的尺寸是固定的尺寸,尺寸大小的结果。

假设c有一个与类基本类型int8和大小:10 x7x8x: ?。在生成的代码中,类的[c{我}]int8。的大小[c{我}]0 x0x8x0。第二个维度是0。第一个和最后一个维度是0,因为这些维度是可变大小的基类型。第三个维度是8因为第三维度的大小基本类型是一个固定大小的8。

内部连接,如果大括号不适应可变单元格数组返回元素的索引,MATLAB生成的代码可以有以下区别:

  • 的类c{我}[……]在生成的代码中可以不同于MATLAB中的类。

    c{我}没有返回任何元素,MATLAB删除c{我}从连接。因此,c{我}不影响结果的类。MATLAB决定结果的类基于类的数组,根据优先级的课程。看到与类的有效组合。在生成的代码中,类的[c{我}]影响的整体连接的结果[c{我}][……]因为代码生成器处理c{我}作为[c{我}]。前面描述的规则确定的类[c{我}]

  • 生成的代码的大小[c{我}]可以在MATLAB与大小不同。

    在MATLAB中,连接[c{我}]是一个0 x0翻倍。在生成的代码中,前面描述的规则确定的规模[c{我}]