以下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 :(得分: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
现在,让我们尝试分配并检查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
试一试,看看它是否适合你。
答案 1 :(得分:0)
我想我在answer找到了我想要的东西。总而言之,复数数组有两个用于数据的存储块:一个用于存储实部,另一个用于存储虚部。最好的做法应该是将y
初始化为正确大小的双精度数组,让MATLAB按需添加第二个内存块。内存分配的数量最多为两个,似乎没有办法减少它。