MATLAB数组索引详解+高阶用法
MATLAB数组索引详解+高阶用法
MATLAB作为科学计算和工程分析的重要工具,其数组索引功能是掌握该软件的基础。本文详细介绍了MATLAB数组索引的各种高级用法,包括位置索引、逻辑索引、线性索引以及混合索引等,通过具体的代码示例帮助读者深入理解这些索引方法的原理和应用场景。
MATLAB能够方便地表示向量和多个维度的矩阵——就以数组统称吧。各种各样类型的数据都能统一成这样高效的数据结构,所以数组的基础用法很重要。而数组索引更是其中一个很有灵活性的主题,掌握了其高阶用法能写出高效的代码,否则就像是写普通的C语言了。
基础的索引用法可以参考MATLAB的帮助界面,可快速学到一些常用表示法:https://ww2.mathworks.cn/help/matlab/math/array-indexing.html
而索引的细节展示如下,我们用任意数组A(8行5列)来举例。
一、各维度的位置索引
这是最常见的方法,显式地指定元素在数组中的位置,每个维度都指定了位置标号。比如:
A(3,4) % 第3行第4列的一个数
A(1:5,2:4) % 1~5行、2~4行组成的子矩阵
一般来看,每个维度处的索引由一个正整数向量给出。比如
A([2,8,3],[5,1,4])
其中行索引和列索引分别是向量[2,8,3]、[5,1,4]。这表示取出A的第2,8,3行和5,1,4列的交点元素。请注意,新矩阵的行从上往下是A的第2,8,3行,而不是按2,3,8的递增顺序来,列同理。
那么可不可以用矩阵表示各维度的索引放在括号里呢?可以是可以,但没有更多的意义。比如
A1 = A([2,5;6,7] , [4,2;1,3])
matlab会把输入的索引矩阵拉成列向量,再按之前的标准来。拉成列向量是把每一列拿出来依次往下串联,[2,5;6,7]会变成[2;6;5;7]。所以上式等价于
A2 = A([2;6;5;7] , [4;1;2;3])
% 或者
A3 = A([2,6,5,7] , [4,1,2,3])
可以用isequal函数检查两个数组是否完全相同 :
二、各维度的逻辑索引
逻辑索引是逻辑值(假false:0,真true:1)组成的向量,数据类型是logical(如上一幅图的蓝色字体所示)。0表示不取出这个位置,1表示取出这个位置。所以索引向量有个重要的限制,必须与数组的尺寸相匹配,比如
i = logical([1,0,1,0,1,0,1,0]);
j = logical([0,1,0,1,0]);
A(i , j) % 数目匹配了
i = logical([1,0,1,0]);
j = logical([0,1,0,1,0,1,0,1,0]);
A(i , j) % 索引数目不是8和5,不匹配
后者的逻辑向量的长度不是8,5,那人家怎么知道该取哪行该取哪列呢?所以会报错哦。而且还要注意,直接写0,1矩阵放进括号里会报错,因为默认数据类型是double,不是逻辑值,需要先转换类型!
逻辑索引还有个特点:取出的行和列肯定是按原矩阵的行列顺序的。
同样,索引向量如果换为矩阵输入,则会拉成向量进行处理。不再赘述。
三、线性索引
只使用单个索引,而不管数组的大小或维度如何。这种方法称为线性索引。虽然 MATLAB 根据定义的大小和形状显示数组,但实际上数组在内存中都存储为单列元素。顺序是按列排布(从上到下,从左到右),这就是之前提到的把矩阵拉成向量的默认方法。
1. 线性位置索引
A(7) % 按线性顺序第7个元素
接下来就有意思了,如果索引改为矩阵,不会像前两章那样把索引矩阵拉成向量,而是按照索引矩阵的尺寸构造新矩阵。
注意,3:5首先生成了[3,4,5]这一行向量。
所以,只要用一个维度的索引(总维度索引),就可用索引矩阵的尺寸表示新矩阵的尺寸。
2. 线性逻辑索引
逻辑索引也有相似的原理,这里要求索引矩阵的元素数等于A矩阵元素数。但要注意,不能像线性位置索引那样用索引矩阵的尺寸表示新矩阵的尺寸,而是保持第二章的性质把矩阵拉成列向量。所以只要是具有40个元素(8×5)的逻辑索引矩阵,生成的新矩阵总是一个列向量,包含了索引为1的那些原矩阵的元素。唯一的例外就是输入一个1*40的逻辑行向量,此时得到的矩阵是一个行向量。
假设有一个逻辑列向量ii和其改变形状后的矩阵ii2d
其中1的个数为
为节约空间,我们接下来查看一些生成的矩阵的尺寸信息
四、混合索引
可以结合使用位置索引和逻辑索引来访问数组元素。当然这种情况只能发生在对各维度都有索引时。
i = [2,7,4];
j = logical([0,1,1,1,0]);
A(i, j)
五、总结
六、常用索引表示法
A(3,4) % 取第3行第4列的一个元素
A(3,:) % 取第3行
A(:,4) % 取第4列
A(1:4,2:5) % 取某个子数组
A(:) % 把数组拉成一个列向量
A(6:end) % 线性索引第6到最后的元素组成的行向量
A(3:end,2:end) % 取右下角某个子数组
A( A<10 ) % A<10返回与A同尺寸的逻辑数组(8*5),最后得到一个列向量