主要内容

复杂数据的代码生成

定义复杂变量时的限制

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

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是复数:结束结束

具有零值虚部的复杂数据的代码生成

对于代码生成,包含所有零值虚部分的复杂数据仍然是复杂的。这些数据并不真实。这种行为有以下含义:

  • 在某些情况下,按绝对值排序复杂数据的函数的结果可能与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 + 3y的值2 - 3我.在MATLAB中,该代码产生真实的结果z = 4.在代码生成期间,用于xy是已知的,但它们的价值是未知的。因为这个表达式中的一个或两个操作数都是复杂的,z定义为需要存储实部和虚部的复变量。z等于复数结果4 + 0我在生成的代码中,没有4,如MATLAB代码。

这种行为的例外情况有:

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

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

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

    y =真正的(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