首页 > 代码库 > Matlab学习笔记(四)

Matlab学习笔记(四)

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
比较可以知道,两者结果是一样的。


Matlab学习笔记(四)