对于代码生成,您必须在赋值时设置变量的复杂性。将复杂常量赋值给变量或使用复杂的
函数。例如:
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;%x是k = 1时的复数: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函数喷火
然后查看代码生成报告,你会看到y
是复杂的。
codegen喷火报告
如果运行MEX函数,可以在MATLAB工作空间中看到,结果为foo_mex
是真正的价值1
.
z = foo_mex
ans = 1
通常,包含一个或多个复杂操作数的表达式会在生成的代码中产生复杂的结果,即使结果的值为零。考虑下面这行代码:
Z = x + y;
假设在运行时,x
的值2 + 3
和y
的值2 - 3我
.在MATLAB中,这段代码产生了真实的结果z = 4
.在代码生成期间,用于x
和y
都是已知的,但他们的价值却不为人知。因为这个表达式中的一个或两个操作数都是复数,z
定义为需要存储实部和虚部的复杂变量。z
等于复结果4 + 0我
在生成的代码中,不是4
,在MATLAB代码中。
这个行为的例外是:
当复结果的虚部为零时,MEX函数将结果作为实值返回到MATLAB工作空间。看到复杂参数生成的MEX函数的输入和输出.
当实参的虚部为零时,外部函数的复实参为实参。
函数y = foo() code .extrinsic('根号')x = 1 + 0i;% x是复数y =根号(x);% x是实数,y是实数端
接受复杂参数但产生实际结果的函数返回实际值。
y =真正的(x);% y是复数x的实部。y = imagg (x);% y是x的实值虚部y = isreal(x);对于复数x, % y为false(0)。
接受实参但产生复杂结果的函数返回复杂值。
z =复杂(x, y);% z是实数x和y的复数。
当复杂乘法的操作数包含一个非有限值时,生成的代码可能会产生与MATLAB产生的结果不同的结果。这种差异是由于代码生成定义复杂乘法的方式。对于代码生成:
复数与复数的乘积(一个+b我)(c+d我)被定义为(一个c-bd) + (一个d+bc)我.即使实部或虚部为零,也要进行完整的计算。
实值与复数的乘法c(一个+b我)被定义为c一个+cb我.