Может быть полезно знать, что MATLAB хранит реальные / сложные части матрицы отдельно.Попробуйте следующее:
>> format debug
>> a = [1 2i];
>> disp(a)
Structure address = 17bbc5b0
m = 1
n = 2
pr = 1c6f18a0
pi = 1c6f0420
1.0000 0 + 2.0000i
, где pr
- указатель на блок памяти, содержащий действительную часть всех значений, и pi
указатель на комплексную часть всех значений в матрице.Поскольку все элементы хранятся вместе, то в этом случае все они имеют сложную часть.
Теперь сравните эти два подхода:
>> arrayfun(@(x)disp(x),a)
Structure address = 17bbcff8
m = 1
n = 1
pr = 1bb8a8d0
pi = 1bb874d0
1
Structure address = 17c19aa8
m = 1
n = 1
pr = 1c17b5d0
pi = 1c176470
0 + 2.0000i
против
>> for n=1:2, disp(a(n)), end
Structure address = 17bbc930
m = 1
n = 1
pr = 1bb874d0
pi = 0
1
Structure address = 17bbd180
m = 1
n = 1
pr = 1bb874d0
pi = 1bb88310
0 + 2.0000i
Итаккажется, что когда вы обращаетесь к a(1)
в цикле for, возвращаемое значение (в переменной ans
) имеет нулевую комплексную часть (ноль pi
), поэтому считается действительным.
OneС другой стороны, ARRAYFUN, кажется, напрямую обращается к значениям матрицы (не возвращая их в переменной ANS), таким образом, он имеет доступ к указателям pr
и pi
, которые не равны нулю, поэтому все элементы считаются не-реально.
Пожалуйста, имейте в виду, что это только мое толкование, и я могу ошибаться ...