给出以下示例:
>> I=[2 1 3;3 2 4]
I =
2 1 3
3 2 4
>> I(:)
ans =
2
3
1
2
3
4
>> I(1:2)
ans =
2 3
为什么I(:)
返回列向量而I(1:2)
返回较短的行向量?
(:)
语法在用作方程右侧的索引时,是一个special operation,它将任何维度的整个矩阵重新整形为单个列向量。因此,以下两行代码给出了相同的结果:
a = I(:); % Create a column vector with ":"
a = reshape(I, [], 1); % Create a column vector with RESHAPE
当数值包含在单个冒号的任一侧时,它表示linear indices到阵列的范围。所以I(1:2)
从I
中选择第一个和第二个元素(即第一列中的值)。要记住的一件事是语法1:2
实际上创建了一个矢量[1 2]
,所以I(1:2)
与I([1 2])
相同。由于线性索引[1 2]
是行向量,因此返回值被整形为行向量[2 3]
。如果使用索引I([1; 2])
或I((1:2).')
,则线性索引是列向量,因此返回的值将被整形为列向量[2; 3]
。
当您用逗号分隔多个索引时,索引将应用于要索引的矩阵的不同维度。例如,I(1:2, 1:2)
将返回2乘2矩阵[2 1; 3 2]
。索引中的第一个1:2
应用于行,因此选择第一行和第二行。索引中的第二个1:2
应用于列,因此选择第一列和第二列。
描述colon operator和matrix indexing的MATLAB文档应该有助于您更好地理解如何有效地使用:
。
Matlab索引的示例
[rows,cols] = size(M); % M is a rows x cols matrix
访问第i行第j列的条目:
x = M(i,j);
访问第i行的所有项目:
r = M(i,:);
访问第j列的所有项目:
c = M(:,j);
访问第i行第j列的条目,将M视为向量:
x = M(rows*(j-1)+i);
访问从第i行到第j行以及从第p列到第q列的子矩阵:
S = M(i:j,p:q);
访问整个矩阵(冗余):
M = M(:,:);
说明 冒号运算符要么给出一系列索引(1:2是范围1到2的索引,包括范围,而3:5给出范围3,4,5)或者如果没有范围则给出给定维度的整个范围已指定。
这与使用单个索引索引矩阵的事实相结合,为您提供了通过逐步执行许多条目(沿着行向下,增加列并在最后一行之后重置行)而不是给出的条目您只需指定的行/列即可显示您的观察结果。
(:)
沿着列向量化矩阵,即沿着列读取的元素被连接成单个列向量。 a:b:c
返回一系列数字,从a
到c
,增量为b
。如果省略b
,则默认设置为1
。
序列a:b:c
可用于沿着列线性地索引矩阵。如果用于索引多维数组,则它会沿该维度选择元素。对于例如
I(1,2:3)
返回行1
和2:3
列I
形成的矩阵,即[1 3]
此外,我们可以以任何方式到达索引,并使用它来索引I.
index = [1 2 3];
disp(I(index));
以上显示了按主列顺序排列的前三个元素(沿着列),即[2 ; 3 ; 1]