Matlab 用a(b)=c实现矩阵寻访&赋值 个人探究小记

今晚实验室同门看代码时遇到个问题,给我们举例子阐明问题时无意间发现了个令人费解的现象。经过大家探讨和实验探明了一些东西,现记录如下:

% 任意给一个向量或矩阵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也不同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值