MATLAB:语法(:)如何工作?

时间:2010-04-25 05:12:37

标签: matlab syntax subscript colon matrix-indexing

给出以下示例:

>> 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)返回较短的行向量?

3 个答案:

答案 0 :(得分:9)

(:)语法在用作方程右侧的索引时,是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 x 2矩阵[2 1; 3 2]。索引中的第一个1:2应用于行,因此选择第一行和第二行。索引中的第二个1:2将应用于列,因此将选择第一列和第二列。

描述colon operatormatrix indexing的MATLAB文档应该有助于您更好地理解如何有效地使用:

答案 1 :(得分:2)

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)或者如果没有范围则给出给定维度的整个范围已指定。

这与使用单个索引索引矩阵的事实相结合,为您提供了通过逐步执行许多条目(向下行,递增列并重置最后一行之后的行)所产生的条目而不只是给你指定的行/列导致你的观察。

答案 2 :(得分:0)

(:)沿着列向量化矩阵,即沿着列读取的元素被连接成单个列向量。 a:b:c返回ac的数字序列,增量为{​​{1}}。如果省略b,则默认设置为b

序列1可用于沿列线性索引矩阵。如果用于索引多维数组,则它会沿该维度选择元素。例如,

a:b:c

返回由I(1,2:3) 的行12:3I形成的矩阵,即[1 3]

此外,我们可以以任何方式获得索引,并使用它来索引I.

index = [1 2 3];
disp(I(index));

上面显示了按主列顺序排列的前三个元素(沿着列),即[2 ; 3 ; 1]