Indexing
Matrix Indexing
Accessing Single Elements
可以使用如下语法来调用一个矩阵(Matrix)中的一个特定的元素:
A(row,column):A是变量名,行在前,列在后。例如:
A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
A(4, 2) ans = 14
Linear Indexing
我们也可以只使用一个下标(subscript)来索引一个矩阵(matrix)的元素:A(k)。MATLAB存储矩阵(matrix)和数组(arrays)是以列来存储的,例如:
A = [2 6 9; 4 2 8; 3 5 1] A = 2 6 9 4 2 8 3 5 1
它在内存中的存储序列为:
2, 4, 3, 6, 2, 5, 9, 8, 1
所以如果我们想要索引第三行第二列的元素,我们可以使用A(3,2)或者使用A(6)。
如果我们提供了多个下标(subscripts),MATLAB依据要索引的数组来以列计算所要索引的元素的位置。例如,有一个二维数组A,它的大小为[d1,d2],如果我们提供两个下标(i,j),那么偏移量(offset)为:
(j-1)*d1+i
Functions That Control Indexing Style
可以使用sub2ind来把行列下标(row-column subscript)变成线性下标(linear subscript):
A = [2 6 9; 4 2 8; 3 5 1]; linearindex = sub2ind(size(A), 3, 2) linearindex = 6
反之使用ind2sub函数:
[row col] = ind2sub(size(A), 6) row = 3 col = 2
Accessing Multiple Elements
对于一个4*4的矩阵,计算第4列的元素的和,可以像下面这样:
A = magic(4); A(1,4) + A(2,4) + A(3,4) + A(4,4)
我们可以使用colon operator来代替:
A(1:m, n)
该式计算矩阵A的第n列元素的和。我们根据这个,可以算出矩阵A的所有元素的和:
sum(A(1:4, 4))
Nonconsecutive Elements
为了索引不相邻的元素,可以使用colon operator并且加上间隔值(step value):
B = A; B(1:3:16) = -10 B = -10 2 3 -10 5 11 -10 8 9 -10 6 12 -10 14 15 -10
MATLAB支持使用数组索引,也就是说索引可以是一个数组:
A = 5:5:50 A = 5 10 15 20 25 30 35 40 45 50 B = [1 3 6 7 10]; A(B) ans = 5 15 30 35 50
如果用一个矢量来索引一个矢量(vector),那么输出结果的形式和索引的形式是一样的:
A(B‘) ans = 5 15 30 35 50 A1 = A‘; A1(B) ans = 5 15 30 35 50
如果用一个非矢量来索引一个矢量,那么输出结果的形式和索引的形状和大小一样:
C = [1 3 6; 7 9 10]; A(C) ans = 5 15 30 35 45 50
The end Keyword
MATLAB提供了一个关键字end来表示任意维数组的最后一个元素,这在编程的时候特变有用,当不知道数组的大小的时候就可以使用这个。
B(1:3:end) = -10
Specifying All Elements of a Row or Column
sum(A(:, 2)) ans = 34
用colon operator来代替linear indexing中的下标,就代表所有的元素:
A(:) ans = 16 5 9 4 . . . 12 1
Using Logicals in Array Indexing
一个逻辑数组的结果是来自数组A,这些值是基于他们在索引数组B中的位置,而不是他们的值。在这种运算中,每一个在索引数组(indexing array)中true的元素,才能够被当做位置索引(positional index)被处理。
在下面的例子中,B是一个0、1逻辑矩阵,这些元素在B中的位置决定了A中的哪些元素能够被表达式A(B)处理:
A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 B = logical([0 1 0; 1 0 1; 0 0 1]); B = 0 1 0 1 0 1 0 0 1 A(B) ans = 4 2 6 9
find函数对于逻辑数组(logical arrays)而言是非常有用的,它返回逻辑数组中非零元素的线性索引(linear indices):
find(B) ans = 2 4 8 9
应用例子:
这个例子创建了一个逻辑数组B,它满足条件:A>0.5。A使用B中元素的位置来处理索引:
rng(0,‘twister‘); % Reset the random number generator A = rand(5); B = A > 0.5; A(B) = 0 A = 0 0.0975 0.1576 0.1419 0 0 0.2785 0 0.4218 0.0357 0.1270 0 0 0 0 0 0 0.4854 0 0 0 0 0 0 0
另一个简单的表达式是:
A(A > 0.5) = 0
:
这个例子用来标注素数,并且令非素数为0:
A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 B = isprime(A) B = 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 A(~B) = 0; % Logical indexing A A = 0 2 3 13 5 11 0 0 0 7 0 0 0 0 0 0
find(B) ans = 2 5 6 7 9 13
Logical Indexing with a Smaller Array
在大多数情况下,逻辑索引数组(logical indexing array)应该和被要索引的数组应大小相等,但是这不是必须的,有时可以更小,但是不能更大:
A = [1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 B = logical([0 1 0; 1 0 1]) B = 0 1 0 1 0 1 isequal(numel(A), numel(B)) ans = 0 A(B) ans = 4 7 8
MATLAB对于逻辑索引数组中那些没有的元素自动补零:
% Add zeros to indexing array C to give it the same number of % elements as A. C = logical([B(:);0;0;0]); isequal(numel(A), numel(C)) ans = 1 A(C) ans = 4 7 8
比较可以知道,两者结果是一样的。