给定以下示例:
>> 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)
返回较短的行向量?
给定以下示例:
>> 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)
返回较短的行向量?
(:)
当用作等式右侧的索引时,该语法是一种特殊操作,可将任意维度的整个矩阵重塑为单个列向量。因此,以下两行代码给出了相同的结果:
a = I(:); % Create a column vector with ":"
a = reshape(I, [], 1); % Create a column vector with RESHAPE
当数字值包含在单个冒号的任一侧时,它表示数组中的一系列线性索引。因此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
应用于列,因此选择了第一列和第二列。
Matlab 索引示例
[行,列] = 大小(M);% M 是一个 rows x cols 矩阵
访问第 i 行第 j 列的条目:
x = M(i,j);
访问第 i 行上的所有项目:
r = M(i,:);
访问列 j 上的所有项目:
c = M(:,j);
访问第 i 行第 j 列的条目,将 M 视为向量:
x = M(行*(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]