举一个简单的例子:

a = [1 2i];

x = zeros(1,length(a));
for n=1:length(a)
    x(n) = isreal(a(n));
end

为了使代码矢量化,我尝试了以下操作:
y = arrayfun(@isreal,a);

但是结果不一样:
x =
     1     0
y =
     0     0

我究竟做错了什么?

最佳答案

这肯定是一个错误,但是这里有一个解决方法:

>> y = arrayfun(@(x) isreal(x(1)),a)

ans =

     1     0

为什么这样做?我不太确定,但是看来,当您在调用ISREAL之前对变量执行索引操作时,如果虚部为零,它将从数组元素中删除“complex”属性。在命令窗口中尝试以下操作:
>> a = [1 2i];         %# A complex array
>> b = a(1);           %# Indexing element 1 removes the complex attribute...
>> c = complex(a(1));  %# ...but we can put that attribute back
>> whos
  Name       Size            Bytes  Class      Attributes

  a          1x2                32  double     complex
  b          1x1                 8  double                  %# Not complex
  c          1x1                16  double     complex      %# Still complex

显然,ARRAYFUN必须在内部维护传递给ISREAL的数组元素的“complex”属性,因此即使虚部为零,也将它们全部视为复数。

10-08 14:29