主要内容

复杂数据的代码生成

定义复杂变量时的限制

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

X = 5 + 6i;% x是一个赋值复数。Y =复数(5,6);% y是复数5 + 6i。

赋值之后,你不能改变变量的复杂度。以下函数的代码生成失败是因为X (k) = 3 + 4i改变的复杂性x

函数x = test1() x = 0 (3,3);% x对于k = 1是实数: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是复数,虚数部等于零结束

    如果为喷火然后查看代码生成报告,可以看到y是复杂的。

    codegen喷火报告

    如果运行MEX函数,可以在MATLAB工作区中看到的结果为foo_mex是真正的价值1

    Z = foo_mex
    Ans = 1

具有复杂操作数的表达式的结果

通常,包含一个或多个复杂操作数的表达式在生成的代码中会产生复杂的结果,即使结果值为零。考虑下面这行代码:

Z = x + y;

假设在运行时,x有价值2 + 3i而且y有价值2 - 3i.在MATLAB中,这段代码产生了真实的结果Z = 4.在代码生成期间,为的类型x而且y是已知的,但他们的价值却不为人所知。因为这个表达式中的一个或两个操作数都是复杂的,z定义为需要存储实部和虚部的复杂变量。z等于复数结果4 + 0i在生成的代码中,不是4,如MATLAB代码。

这种行为的例外情况是:

  • 当复数结果的虚部为零时,MEX函数将结果作为实值返回给MATLAB工作空间。看到为复杂参数生成的MEX函数的输入和输出

  • 当实参的虚部为零时,外部函数的复实参为实。

    函数y = foo() code .extrinsic('sqrt') x = 1 + 0i;% x是复数y =√(x);% x是实数,y是实数
  • 接受复杂参数但产生真实结果的函数返回真实值。

    Y = real(x);% y是复数x的实部y = imag(x);% y是x的实值虚部。y = isreal(x);对于复数x, % y为假(0)。
  • 接受实参数但产生复杂结果的函数返回复杂值。

    Z =复数(x,y);% z是实数x和y的复数。

非有限值复乘法的结果

当复杂乘法的操作数包含非有限值时,生成的代码产生的结果可能与MATLAB产生的结果不同。这种差异是由于代码生成定义复杂乘法的方式造成的。代码生成:

  • 一个复值乘以另一个复值一个+b我)(c+d我)定义为一个c-bd) + (一个d+bc)我.即使实部或虚部为零,也可以进行完整的计算。

  • 实值与复值的乘积c一个+b我)定义为c一个+cb