生成的代码和之间的区别MATLAB代码
将MATLAB®代码有效的C / c++代码,代码生成器介绍优化故意导致生成的代码不同,有时产生不同的结果,比原来的源代码。
这里有一些差异:
当您运行您的程序,运行时错误检查可以检测其中的一些差异。默认情况下,运行时错误检查为墨西哥人代码启用和禁用独立的C / c++代码。帮助您识别和解决差异之前部署代码,代码生成器报道差异的一个子集潜在的差异。
循环索引溢出
假设一个为
循环结束值等于或接近最大值或最小值的循环索引的数据类型。在生成的代码中,循环的最后一个盈亏指数可能导致索引变量溢出。该指数溢出可能导致无限循环。
当启用内存完整性检查,如果代码生成器检测到循环指数可能会溢出,它会报告错误。软件错误检查是保守的。它可能错误地报告一个循环指数溢出。默认情况下,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) %循环体 |
|
重写循环,循环指数在过去的循环迭代结束等于价值。 |
字符长度
MATLAB支金宝app持16位字符,但是生成的代码在8位代表人物,大多数嵌入式语言如c的标准尺寸编码的字符代码生成。
订单的评估表达式
生成的代码不执行的顺序评估表达式。对于大多数表情,评价的顺序并不重要。然而,表达式的副作用,生成的代码可能产生的副作用从最初的MATLAB代码不同的顺序。表达式产生的副作用包括那些:
修改持久或全局变量
数据显示到屏幕上
写入数据到文件
修改处理类对象的属性
此外,生成的代码不执行逻辑运算符的评价顺序不短路。
可预测的结果,是良好的编程实践的表达式,取决于评价的顺序分割成多个语句。
重写
一个= f1 () + f2 ();
作为
一个= f1 ();一个= A + f2 ();
这样生成的代码调用
f1
之前f2
。分配一个多输出函数调用的输出不依赖于另一个变量。例如,重写
[y, y。f, y。g) = foo;
作为
(y, a, b) = foo;y。f =一个;y。g = b;
当你访问一个单元阵列的多个细胞的内容,分配结果不依赖于另一个变量。例如,重写
[y, y。f, y。z g) = {};
作为
(y, a, b) z = {:};y。f =一个;y。g = b;
终止的行为
生成的代码不匹配的终止行为MATLAB源代码。例如,如果无限循环没有副作用,优化生成的代码删除掉。结果,生成的代码可能终止,即使没有相应的MATLAB代码。
大小适应一天数组
为适应一天数组大小
函数会返回一个不同的结果比MATLAB源代码生成的代码。的大小
函数有时返回后的(单维度)生成的代码,但总是下降的MATLAB。例如,对于一个一天数组X
与维[4 2 1 1]
,大小(X)
可能会返回[4 2 1 1]
在生成的代码,但总是返回(4 - 2)
在MATLAB。看到不相容与MATLAB在决定大小适应一天数组。
空数组大小
在代码生成一个空数组的大小可能不同于它的大小在MATLAB源代码。看到不相容与MATLAB在确定空数组的大小。
删除空数组的大小,结果数组的元素
删除数组中的所有元素导致一个空数组。这个空数组的大小在生成的代码可能不同于它的大小在MATLAB源代码。
情况下 | 示例代码 | 在MATLAB环境下空数组的大小 | 大小的空数组生成的代码 |
---|---|---|---|
删除一个m×n的数组的所有元素使用结肠 操作符(: )。 |
coder.varsize (“X”(4,4),[1]);X = 0 (2);X (:) = [];
|
0-by-0 |
1-by-0 |
删除一个行向量的所有元素使用结肠 操作符(: )。 |
coder.varsize (“X”[1,4],[0,1]);X = 0 (1,4);X (:) = [];
|
0-by-0 |
1-by-0 |
删除一个列向量的所有元素使用结肠 操作符(: )。 |
coder.varsize (“X”(4,1),(1,0));X = 0 (4,1);X (:) = [];
|
0-by-0 |
0-by-1 |
删除一个列向量的所有元素删除一个元素。 |
coder.varsize (“X”(4,1),(1,0));X = 0 (4,1);为我= 1:4 X (1) = [];结束 |
1-by-0 |
0-by-1 |
使用单引号和双操作数二进制Element-Wise操作
如果你的MATLAB代码包含一个二进制element-wise操作,包括一个操作数类型和双操作数类型,生成的代码可能不像MATLAB产生相同的结果。
对于这样的一个操作,MATLAB将两个操作数转换为double类型和双重的执行操作的类型。MATLAB然后单一类型,并返回它的结果。
生成的代码将单一类型的双操作数类型。然后两个单的执行操作的类型和返回结果。
例如,定义一个MATLAB函数喷火
二进制element-wise调用操作+
。
函数= foo (a, b) = a + b;结束
定义一个变量s1
单一类型的一个变量v1
双类型。生成一个墨西哥人功能喷火
接受一个单一类型的输入和双类型输入。
s1 =单(1.4 e32);d1 = -5.305 e + 32;codegen喷火arg游戏{s1, d1}
叫两个喷火
和foo_mex
与输入s1
和d1
。比较两个结果。
毫升= foo (s1、d1);多层陶瓷= foo_mex (s1、d1);毫升= =多层陶瓷
ans =逻辑0
是一个逻辑的输出比较0
,这表明所生成的代码,并对这些输入MATLAB产生不同的结果。
浮点数值结果
生成的代码可能不会产生相同的浮点数值结果MATLAB在这些:
南和无穷
生成的代码可能不产生完全相同的模式南
和正
值,这些值时MATLAB代码的数学意义。例如,如果包含一个MATLAB输出南
生成的代码,输出还应该包含一个南
,但不一定在同一个地方。
的位模式南
MATLAB代码之间可以不同输出和生成的代码输出,因为C99标准数学库,用于生成代码没有指定一个独特的位模式南
在所有的实现。避免比较二进制模式在不同的实现,例如,MATLAB产出和硅之间或公益诉讼输出。
负0
一个浮点类型的值0
有一个积极的迹象或负号。用算术方法,0
等于0
的迹象,但一些操作敏感输入0。例子包括rdivide
,量化
,atan2d
,角
。除0
生产正
,但除0
生产负
。同样的,atan2d (0, 1)
生产180年
,但atan2d (0, 1)
生产-180年
。
如果代码生成器检测到一个浮点变量只需要整数值的一个合适的范围内,那么代码生成器可以使用整数类型的变量在生成的代码中。如果代码生成器使用整数类型的变量,变量存储0
作为+ 0
因为一个整数类型不存储的标志值0
。如果生成的代码将返回一个浮点类型变量,的标志0
是正的。除0
生产正
,而不是负
。同样的,atan2d (0, 1)
生产180年
,而不是-180年
。
目标代码生成
的coder.target
函数返回不同的值在MATLAB生成的代码。目的是帮助您确定您的函数执行在MATLAB编制了模拟或目标代码生成。看到coder.target
。
MATLAB类属性初始化
在类加载时,代码生成之前,MATLAB计算类的默认值。代码生成器使用MATLAB计算的值。它不验算默认值。如果属性定义使用一个函数调用来计算初始值,代码生成器不执行这个函数。如果函数有副作用,如修改全局变量或一个持久的变量,那么它可能生成的代码可以产生不同的结果,MATLAB产生。有关更多信息,请参见定义类的属性代码生成。
MATLAB类属性访问方法,修改属性值
使用对象和属性访问方法时,墨西哥人从MATLAB的函数结果可能不同的结果。这些差异时的对象是:
从一个入口点函数的输入或输出。
传递到或从一个外部函数返回。
加载到内存使用
负载
。作为全局变量。
结果可以在这些条件下不同:
get方法返回一个不同的值的存储属性值。
前一组方法修改一个输入值分配财产。
get方法或方法有副作用,如修改全局变量或写入一个文件。
结果可能不一致造成的不同属性访问方法的使用MATLAB和生成的代码时,将对象传递给对方:
当你调用一个墨西哥人函数的输入是一个对象,或从一个外部函数返回一个对象,MATLAB将对象传递到生成的代码。生成的代码创建自己的对象。提供属性值对象创建过程,MATLAB调用get方法。对象创建过程分配这些属性值从MATLAB直接到新对象没有调用设置方法。
当你从墨西哥人函数返回一个对象或调用一个外部函数对象作为输入,MATLAB的墨西哥人函数传递对象。为MATLAB提供属性值,而不是使用get方法,生成的代码直接读取属性值。分配对象的属性值在MATLAB版本,创建过程使用set方法。
为了避免结果差异MATLAB和一个墨西哥人函数,不使用类属性访问方法在这种情况下。
有关更多信息,请参见定义类的属性代码生成。
MATLAB类在嵌套的属性分配,设置方法
当你处理对象属性赋值,这是另一个对象的属性,等等,然后生成的代码可以调用设置方法不调用MATLAB处理类。
例如,假设您定义一组变量等x
是一个处理对象,巴勒斯坦权力机构
是一个对象,pb
是一个处理对象,然后呢个人电脑
是一个属性的pb
。然后你做一个嵌套的属性赋值,如:
x.pa.pb。电脑= 0;
在这种情况下,生成的代码调用对象的设置方法pb
和设置方法x
。MATLAB调用只设置方法pb
。
MATLAB处理类的析构函数
处理类析构函数生成的代码的行为可以不同于MATLAB在这些情况下的行为:
破坏几个独立对象的顺序可能不同在MATLAB生成的代码。
在生成的代码中对象的生命周期在MATLAB可以不同于一生。
生成的代码不会破坏部分构造对象。如果一个处理对象不是完全建立在运行时,生成的代码会产生一个错误消息但不调用
删除
该对象的方法。系统对象™,如果有一个运行时错误setupImpl
,生成的代码没有电话releaseImpl
的对象。MATLAB是调用
删除
方法摧毁部分构造对象。
有关更多信息,请参见代码生成处理类析构函数。
适应数据
复数
看到代码生成复杂的数据。
转换字符串连续,一元操作符双
转换为一个字符串,该字符串包含多个连续的一元运算符双
可以产生不同的结果与MATLAB生成的代码。考虑一下这个函数:
函数= foo (op) =双(op + 1);结束
对于一个输入值”——“
,该函数将字符串“- 1”
来双
。在MATLAB中,答案是南
。在生成的代码中,答案是1
。