对于代码生成,必须在转让时设置的变量的复杂性。分配一个复常数的变量,或者使用复杂
功能。例如:
x = 5 + 6i;% x是一个分配的复数。y =复杂(5、6);y是复数5 + 6i。
分配后,你不能改变一个变量的复杂性。代码生成以下函数失败,因为X(K)= 3 + 4I
改变的复杂性X
。
函数x = test1() x = 0 (3,3);当k = 1时,% x是实数:numel(x) x(k) = 3 + 4i;结束结束
要解决此问题,请为X
。
函数x = test1() x = 0 (3,3)+ 0i;k = 1时,%x是复数:numel(x) x(k) = 3 + 4i;结束结束
对于代码生成,所有虚部为零的复杂数据仍然是复杂的。这些数据不会变成真实的。这种行为有以下含义:
在某些情况下,按绝对值对复杂数据进行排序的函数的结果可能与MATLAB不同®结果。看到由绝对值函数那种复杂的值。
对于要求复数输入按绝对值排序的函数,虚部为零的复数输入必须按绝对值排序。这些功能包括ismember
,联盟
,相交
,setdiff
,setxor
。
功能,通过绝对值排序复值包括排序
,issorted
,sortrows
,中位数
,分
,马克斯
。这些函数按绝对值对复数进行排序,即使虚部为零。通常,对绝对值排序产生的结果与对实部排序产生的结果不同。因此,当这些函数的输入在生成的代码中是虚数为零的复数,而在MATLAB中是实数时,生成的代码会产生与MATLAB不同的结果。在下面的示例中,输入排序
是在MATLAB真实的,但在生成的代码的零值虚部络合物:
通过创建MEX功能MATLAB编码器™:
假设您为复杂输入生成了MEX函数。如果使用实输入调用MEX函数,则MEX函数将实输入转换为虚数部分为零的复数值。
如果MEX函数返回一个具有全零虚部的复值,该MEX函数返回值到MATLAB的工作空间为实际值。例如,考虑这样的功能:
函数Y = FOO()Y = 1 + 0I;% y是虚部等于零的复数结束
如果您生成一个MEX功能FOO
并查看代码生成报告ÿ
是复杂的。
代码生成FOO报告
如果运行MEX函数,可以在MATLAB工作区中看到foo_mex
是真正的价值1
。
z = foo_mex
ANS = 1
在一般情况下,含有一个或多个操作数复杂的表达式产生在生成的代码复杂结果,即使结果的值是零。考虑下面的代码行:
Z = X + Y;
假设在运行时,X
有值2 + 3i的
和ÿ
有值2 - 3我
。在MATLAB中,该代码产生实际结果Z = 4
。在代码生成期间,为X
和ÿ
都是已知的,但它们的价值却不为人知。因为这个表达式中的一个或两个操作数都是复数,ž
定义为需要存储实部和虚部的复变量。ž
等于复数结果4 + 0I
在生成的代码中,不是4
,如MATLAB代码中所示。
例外的习性是:
当复杂的结果的虚数部分为零,MEX函数的结果返回到MATLAB工作空间的实数值。看到输入和输出MEX函数生成的复杂参数。
当实参数的虚部为零时,外函数的复参数为实参数。
函数y = FOO()coder.extrinsic( 'SQRT')X = 1 + 0I;%X是复杂的Y = SQRT(X);%x为实数,y是真实的最终
这需要复杂的参数,但实际的成果函数返回的实际值。
Y =实际(X);%,y是复数x的实部。Y = IMAG(X);%y是x的实值虚部。Y =伊斯雷尔(X);%Y为复数x假(0)。
是采取真正的论点,但产生复杂的效果函数返回复数值。
z =复杂(x, y);z是实数x和y的复数。
当复数乘法的操作数中包含一个非限定值,所生成的代码可能会产生不同的结果比MATLAB产生的结果。差是由于代码生成定义复数乘法的方式。对于代码生成:
通过复数值复值的倍增(一种+b一世) (C+d一世)被定义为(一种C-bd)+(一种d+bC)我。即使实部或虚部为零,也要进行完整的计算。
复数与实值的乘积C(一种+b一世)被定义为C一种+Cb一世。