#常见矩阵元素索引方法
矩阵作为MATLAB中的基本单位,灵活地实现对其元素的索引是有效处理矩阵的必要基础。显然地,MATLAB也的确提供了很多的矩阵元素索引方法12。常见的矩阵元素索引方法分别如下所示:
##逻辑索引
**逻辑索引通过使用元素为0或1的逻辑矩阵来索引矩阵a中的元素,因此它们的维数必须相同。**具体例子如下:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold) = 0
a =
1 2 3
4 5 0
0 0 0
也可以直接写成如下形式:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> a(a>5) = 0
a =
1 2 3
4 5 0
0 0 0
##数组索引
根据参考书籍3中分类,数组索引可以划分为:单下标索引和多下标索引。单下标索引的具体例子如下:
>> a = 1:6
a =
1 2 3 4 5 6
>> a(3) = 5
a =
1 2 5 4 5 6
>> a([2,4])=[4,2]
a =
1 4 5 2 5 6
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> b(:)
ans =
1
4
7
2
5
8
3
6
9
在MATLAB中,单个数值可以理解为一个元素的1×1的矩阵,因此参考文献2中所谓的线性索引也不过是数组索引的一种特例。从上边的例子可以看出,单下标索引中的冒号索引可以实现多维矩阵的列向量化,这和多下标索引中的冒号索引又不尽相同。
多下标索引的例子具体如下:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> a(2,2) = 0
a =
1 2 3
4 0 6
7 8 9
>> a([1 3],[2 3])
ans =
2 3
8 9
>> a(:,1)
ans =
1
4
7
>> a(:,[1,3])
ans =
1 3
4 6
7 9
>> a(1,:)
ans =
1 2 3
>> a([1,3],:)
ans =
1 2 3
7 8 9
从上边的例子可以看出,单下标索引和多下标索引的冒号索引的作用是不尽相同的。
综上所述,MATLAB中矩阵元素的索引方法分为两种:逻辑索引和数组索引。其中,数组索引又可以分为单下标索引和多下标索引,冒号索引在不同情况下表示的含义亦不尽相同。
#两者的区别和联系
逻辑索引要求索引矩阵必须和矩阵a的维数相同,而数组索引则没有这样的要求。但是数组索引中的单下标索引,又具有一些和逻辑索引的相同之处,通过下边的例子来说明:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold)
ans =
7
8
6
9
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> b(4)
ans =
2
>> b([5 7])
ans =
5 3
从上边的例子可以看出,当对多维矩阵进行单下标索引时,会首先将矩阵b进行列向量化,然后再按顺序选出其对应的元素。而逻辑索引也是默认进行列向量化后再按顺序选出其对应的元素。
#find函数本质是数组索引
通过逻辑索引和数组索引的区别和联系,我们将很容易得出find函数本质是数组索引的结论,具体通过下边的例子进行说明:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold)
ans =
7
8
6
9
>> a(threshold) = 0
a =
1 2 3
4 5 0
0 0 0
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> index = find(b>5)
index =
3
6
8
9
>> b(index) = 0
b =
1 2 3
4 5 0
0 0 0
从上边的例子可以明显地看出,矩阵threshold是和矩阵a维数相同的逻辑矩阵,而矩阵index只是记录了矩阵b列向量化后大于5的元素的索引,且和矩阵b的维数并不相同。
#参考文献
- matlab数组索引和逻辑索引 ↩︎
- matlab随手记 ↩︎ ↩︎
- 张志涌, 杨祖樱. MATLAB教程(R2006a-R2007a)[M]. 北京:北京航空航天大学出版社, 2006. 8 ↩︎