主要内容

复杂数据的代码生成

定义复杂变量时的限制

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

x = 5 + 6i;%x是通过赋值的复数。y =复杂(5,6);%y是复数5 + 6i。

赋值后,不能更改变量的复杂性。以下函数的代码生成失败,原因如下X (k) = 3 + 4i改变了x

函数x = test1()x =零(3,3);%x为k = 1:numel(x)x(k)= 3 + 4i;结束

要解决此问题,请分配复杂的常量x

函数x = test1()x =零(3,3)+ 0i;%x为k = 1:numel(x)x(k)= 3 + 4i;结束

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

对于代码生成,具有所有零值虚构部分的复杂数据仍然很复杂。此数据不会变得真实。此行为具有以下含义:

  • 在某些情况下,通过绝对值对复杂数据进行排序的功能的结果可能与MATLAB不同®结果。看到按绝对值对复数排序的函数

  • 对于要求通过绝对值对复杂输入进行排序的功能,必须通过绝对值对具有零值的虚部的复杂输入进行排序。这些功能包括ismember联盟相交setdiff., 和setxor

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

按绝对值对复数排序的函数包括种类订购排队中位数最小值, 和最大.即使当虚部部分为零,这些功能也通过绝对值对复数进行分类。通常,对绝对值进行排序,而不是排序实际部分的不同结果。因此,当对这些函数的输入复杂时,在生成的代码中具有零值的虚部,但在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 - 3i..在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