今晚实验室同门看代码时遇到个问题,给我们举例子阐明问题时无意间发现了个令人费解的现象。经过大家探讨和实验探明了一些东西,现记录如下:
% 任意给一个向量或矩阵a
a=[4;3;2;1];
% b可以是任意形状,但其中各元素的值不超过a的元素数目
b=[1,2,1;3,4,2;4,3,1];
a(b) % 可以以b中的值为索引,取出a元素组成新矩阵
>>> ans = [4,3,4;2,1,3;1,2,4]
% c的元素数目须与b相同
c=[11,22,33,44,55,66,77,88,99] % 1*9
a(b)=c % 可以将c中的值按b给的索引赋到a中去
>>> a = [99;88;66;55]
d=[11,22,33;44,55,66;77,88,99] % 3*3
a(b)=d
>>> a = [99;66;88;55]
为何会出现c与d形状不同导致最后结果不同的现象呢?先说结论:matlab喜欢竖着来。
事实上,在进行上述按索引赋值的操作时,matlab内部(可能是)按如下步骤进行的:
1、若等号右边矩阵与b形状不同,则先将其reshape为b的形状。注意reshape是按列填充矩阵的,举个栗子:
reshape([1,2,3,4],2,2)
>>> ans = [1,3;
2,4]
2、索引矩阵与赋值矩阵形状匹配后,按列进行寻访和赋值。我用PPT做了个动画演示:
c先reshape,导致了赋值矩阵的不同,所以最终得到的a也不同。