如果要确保保留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
试一下,看看是否适合你。
如果'y'初始时全为0,则铸造'x(1)'不起作用。它似乎适用于您的示例,因为y(2)具有非零虚部。 – 2014-12-06 03:49:57
@FabioSomenzi - 我明白了。但是,你不应该关心'x'被转换为纯真实的。请参阅我的编辑,了解如果从纯真实数组开始,然后将复数值赋给其中的任何位置,会发生什么情况。 – rayryeng 2014-12-06 03:52:12
根据复杂属性的实现方式,我可能会担心导入很少的问题,但我希望一次性完成返回值的分配。 – 2014-12-06 03:53:14