代码生成复杂数据

定义复变量时的限制

对于代码生成,必须在转让时设置的变量的复杂性。分配一个复常数的变量,或者使用复杂功能。例如:

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

由绝对值函数那种复杂的值

功能,通过绝对值排序复值包括排序issortedsortrows中位数,马克斯。这些函数按绝对值对复数进行排序,即使虚部为零。通常,对绝对值排序产生的结果与对实部排序产生的结果不同。因此,当这些函数的输入在生成的代码中是虚数为零的复数,而在MATLAB中是实数时,生成的代码会产生与MATLAB不同的结果。在下面的示例中,输入排序是在MATLAB真实的,但在生成的代码的零值虚部络合物:

  • 你通过实时输入到函数生成的复杂输入

  • 输入排序在生成的代码中返回复杂函数的输出

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

通过创建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一世