如何防止MATLAB丢弃"复杂"数组的属性?

时间:2014-12-06 03:23:16

标签: arrays matlab complex-numbers

以下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是预分配的返回值。

2 个答案:

答案 0 :(得分:3)

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

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

因为x(1)只有一个真实的组件,所以MATLAB会自动将其转换为real以节省空间。正如您所看到的,如果复数是纯实的,那么简单地存储真实组件会更有效,因为与complex相比,它是8个字节的数字,其中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 

现在,让我们尝试分配并检查xy的类:

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

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

答案 1 :(得分:0)

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