2014-12-06 56 views
0

以下MATLAB代码段,这产生复数的两个阵列,如何防止MATLAB放弃数组的“复杂”属性?

x = complex(1:2,0:1); 
y = complex(zeros(1,2),0); 
whos x y 

打印

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    32 double complex 

如预期。然而,这两个额外的语句后,

y(1) = x(1); 
whos x y 

以下会打印:

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    16 double 

一个如何防止被丢弃复杂的属性?

对于记录,Octave也是如此。

实际上,x是一个函数参数,它的第一个条目恰好具有零虚部,并且y是预分配的返回值。

回答

0

我想我在answer找到了我要找的东西。总而言之,复数数组有两个数据存储块:一个存储实部,一个存储虚部。最好的做法应该是将y初始化为正确大小的双精度数组,并让MATLAB根据需要添加第二个内存块。内存分配的数量最多为两个,似乎没有办法减少它。

3

如果要确保保留complex数据类型,请明确地将该数字转换为complex。因此:

y(1) = complex(x(1)); 

因为x(1)只有一个真正的分量,MATLAB自动这是为了节省空间转换为real。正如你所看到的,如果复数是纯真实的,那么简单地存储真实分量会更有效率,因为它是8个字节的数字,与complex相比,它是16个字节的数字 - 对于真实分量为8,对于虚数为8零件。

同样在你的代码中,y在技术上将全部为real,因为没有虚部。如果y至少有一个复杂值,则y仍将保留为complex。看看下面的代码:

x = complex(1:2,0:1); 
y = complex(zeros(1,2), [3 5]); 
whos x y 

Name  Size   Bytes Class  Attributes 

    x   1x2    32 double complex 
    y   1x2    32 double complex 

现在,让我们尝试分配和检查的x类和y

y(1) = x(1); 
whos x y 

Name  Size   Bytes Class  Attributes 

x   1x2    32 double complex 
y   1x2    32 double complex 

此外,作为一个旁注,你不应该与x有关被转换为纯真实。只要您将至少一个复数值放入此阵列中,x会自动提升为complex。试一下,比如:

x = 1:5; 
whos x 

Name  Size   Bytes Class  Attributes 

x   1x5    40 double 

现在使用相同的x阵列,请尝试:

x(3) = 1 + 4i; 
whos x 

Name  Size   Bytes Class  Attributes 

x   1x5    80 double complex 

编辑

与您的意见,去你能做些什么,以确保该数组将保持复杂将会在x(1)的虚部添加一个无限小数。一个足够小的数字,以便数值差异几乎为零,但足以尊重y仍然是一个复数值阵列。因此:

x = complex(1:2,0:1); 
y = complex(zeros(1,2),0); 
y(1) = x(1) + i*eps; 
who x y 

Name  Size   Bytes Class  Attributes 

x   1x2    32 double complex 
y   1x2    32 double complex 

eps代表machine epsilon。如果显示y,显示出更多显著的数字,这就是我们看到:

format long 
y 

y = 

    1.000000000000000 + 0.000000000000000i 0.000000000000000 + 0.000000000000000i 

试一下,看看是否适合你。

+0

如果'y'初始时全为0,则铸造'x(1)'不起作用。它似乎适用于您的示例,因为y(2)具有非零虚部。 – 2014-12-06 03:49:57

+0

@FabioSomenzi - 我明白了。但是,你不应该关心'x'被转换为纯真实的。请参阅我的编辑,了解如果从纯真实数组开始,然后将复数值赋给其中的任何位置,会发生什么情况。 – rayryeng 2014-12-06 03:52:12

+0

根据复杂属性的实现方式,我可能会担心导入很少的问题,但我希望一次性完成返回值的分配。 – 2014-12-06 03:53:14