主要内容

复杂数据的代码生成

定义复杂变量时的限制

对于代码生成,您必须在赋值时设置变量的复杂性。将复杂常量赋值给变量或使用复杂的函数。例如:

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

按绝对值排序复杂值的函数

按绝对值对复杂值排序的函数包括排序issortedsortrows中位数最小值,马克斯.这些函数根据绝对值对复数排序,即使虚数部分为零。一般来说,对绝对值排序的结果与对实部排序的结果不同。因此,当这些函数的输入在生成的代码中是具有零值虚部的复数,而在MATLAB中是实数时,生成的代码会产生与MATLAB不同的结果。在下面的示例中,输入排序在MATLAB中为实,但在生成的代码中为带零值虚部的复数:

  • 您将真实输入传递给为复杂输入生成的函数

  • 输入排序从一个函数的输出返回复杂的生成代码

复杂参数生成的MEX函数的输入和输出

创建的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 + 3y的值2 - 3我.在MATLAB中,这段代码产生了真实的结果z = 4.在代码生成期间,用于xy都是已知的,但他们的价值却不为人知。因为这个表达式中的一个或两个操作数都是复数,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