举一个简单的例子:
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”属性,因此即使虚部为零,也将它们全部视为复数。