2024年MATLAB中的矩阵索引_matlab indexing matrices,阿里P8手把手教你

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

通过在等式左边使用索引表达式,你可以替换向量中特定元素

v([2 3 4]) = [10  15  20]% 替代v中一些特定元素

v = 16  10  15 20  2  11 7  14

等式右边的元素必须和等式左边下标对应的元素保持一致。然而,你可以在等式右边用标量

v([2 3]) = 30 % 第2和第3元素重新赋值为30

v =

16 30 30 20 2 11 7 1 4

这种索引赋值称作 标量扩张

带有两个下标的索引矩阵

现在考虑矩阵索引的用法,我们用一个魔力方阵来做实验:

A = magic(4)

A =

16 2  3  13

5 11  10  8

9 7   6  12

4 14  15  1

通常,矩阵索引用两个下标 --一个作为行下标,一个作为列下标,最简单方法取出矩阵一个元素如下:

A(2,4) % 取出第2行,第4列对应元素

ans =

8

更为常用的是,一个行下标或列下标可以是向量:

A(2:4,1:2)

ans =

5 11

9 7

4 14

在下标位置的一个符号":",是对”1:end“方便快捷的替代,总是用来选整行或整列元素

A(3, 😃 % 取出完整的第3行

ans =

9 7 6 12

A(:,end) % 取出完整的最后一列

ans =

13

8

12

1

在这儿学习者总是迷惑:如何从矩阵中去取分散的几个元素?例如,假定你想从矩阵A中取出坐标为(2,1),(3,2), 和 (4,4)的元素,表达式

A([2 3 4], [1 2 4])取出的显然不是你所想要的,下图显示了A([23 4], [1 2 4])是如何工作的:

从矩阵中根据特定索引取出离散元素,这带给我们新的下一个话题

线性索引

表达式A(14)表示什么呢?

当你用带一个下标的索引取出矩阵元素时,MATLAB默认矩阵中所有元素一个长列向量来存储数据,如下:

16

5

9

8

12

1

因此,表达式A(14)取出列向量的第14个元素,用单一下标取出数据元素的方式称作:线性索引

这里有矩阵A元素以列向量顺序排布图

矩阵中每一个元素的线性索引都显示在表格左上角

从这张表中你可以看到A(14)和A(2,4)等价

单一下标可以是一个多个线性索引组合而成的向量,如下:

A([6 12 15])

ans =

11 15 12

再次考虑这个问题:从矩阵A中提取(2,1),(3,2), 和(4,4) 对应的元素?你可以通过用线性

索引来取出这些元素:

A([2 7 16])

ans =

5 7 1

从这个例子中你可以很简单看出索引,但是长远的你如何计算线性索引呢?MATLAB提供一个函数:sub2ind,该函数能够将

特定行列下标转换为线性索引。你可以用这种方式提取特定元素:

idx = sub2ind(size(A), [2 3 4], [12 4])

ans =

2 7  16

A(idx)

ans =

5 7  1

关于用线性索引的最新例子

例1:平移一个矩阵的数排

一个MATLAB用户最近在comp.soft-sys.matlab新手组提出一个问题

如果我想移动矩阵m-n列k次,我用A(:,[n-k+1:n1:n-k])实现,当如果k是一个数字集怎么办?也就是说,倘若k是一个长度为m的向量呢,是否有快捷方便的办法做到呢?

社区新手组贡献者,Peter Acklam, 提出了用”sub2ind“和线性索引来解决:

% index vectors for rows andcolumns

p = 1:m;

q = 1:n;

% index matrices for rows andcolumns

[P, Q] = ndgrid(p, q);

% create a matrix with the shiftvalues

K = repmat(k(😃, [1 n]);

% update the matrix with the columnindexes

Q = 1 + mod(Q+K-1, n);

% create matrix of linear indexes

ind = sub2ind([m n], P, Q);

% finally, create the output matrix

B = A(ind);

例2:使矩阵的一些元素为0

另一个MATLAB用户提出这个问题。

我想获取每一个的最大值,这不是什么大问题,但是之后我想令其他元素为0,比如,矩阵:

1 2 3 4

5 5 6 5

7 9 8 3

should become:

0 0 0 4

0 0 6 0

0 9 0 0

另一个社区贡献者,BrettShoelson,提出了解决办法:

[Y,I]= max(A, [], 2);%获取每一行最大值,结果 存在列向量Y中,I里存的是每行最大值的列位置。

B = zeros(size(A));%建立一个和A同等大小的矩阵

B(sub2ind(size(A), 1:length(I),I’)) = Y;%将三个最大值分别放到线性索引对应的位置上

逻辑索引

另一个索引变量,逻辑索引,已被证明其有用并且易于表达。在逻辑索引中,你可以为矩阵下标使用一个单一的逻辑数组,MATLAB取出逻辑判断为真的元素,输出经常是一个列向量。例如,A(A>2)取出矩阵A中所有大于12的元素

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

AB取出逻辑判断为真的元素,输出经常是一个列向量。例如,A(A>2)取出矩阵A中所有大于12的元素

[外链图片转存中…(img-fuabKfsR-1715584831860)]
[外链图片转存中…(img-SLuYm5U9-1715584831860)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值