使用isreal
的结果不一致
举个简单的例子:
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
我究竟做错了什么?
没有找到相关结果
已邀请:
3 个回复
娠侈脚惮顽
为什么这样做?我不完全确定,但似乎当你在调用ISREAL之前对变量执行索引操作时,如果虚部为零,则从数组元素中删除“complex”属性。在命令窗口中尝试此操作:
显然,ARRAYFUN必须在内部维护它传递给ISREAL的数组元素的“复杂”属性,因此即使虚数组件为零,也将它们视为复数。
呢率篓舍烫
其中
是指向包含所有值的实部的内存块的指针,
指向矩阵中所有值的复杂部分的指针。由于所有元素都存储在一起,因此在这种情况下它们都具有复杂的部分。 现在比较这两种方法:
与
所以当你在for循环中访问
时,似乎返回的值(在
变量中)具有零复数部分(null
),因此被认为是真实的。 另一方面,ARRAYFUN似乎直接访问矩阵的值(不在ANS变量中返回它们),因此它可以访问非空的
和ѭ7指针,因此所有元素都被认为是非实数。 请记住这只是我的解释,我可能会弄错...
替秀宝
您在MATLAB中可以找到的是某些操作会自动修剪任何全零虚部。所以,例如
简而言之,MATLAB确实需要一个函数来回答问题“这个值是否具有零虚部”,在元素上以元素方式表示。