matlab 为什么不带值的(:)行为不同?

qybjjes1  于 2023-01-21  发布在  Matlab
关注(0)|答案(3)|浏览(118)

给出以下示例:

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

rfbsl7qr

rfbsl7qr1#

(:)语法用作等式右侧的索引时,它是一个special operation,可将任意维的整个矩阵重新整形为单个列向量。因此,以下两行代码给予了相同的结果:

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。索引中的第二个1:2应用于列。因此选择列1和列2。
描述colon operatormatrix indexing的MATLAB文档应该给予您更好地理解如何有效地使用:

u59ebvdq

u59ebvdq2#

    • 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(包括1和2)中的索引,而3:5给出范围3、4、5),或者如果未指定范围,则给出给定维的整个范围。
这一点,再加上只使用一个索引来索引矩阵,会给你遍历那么多条目(向下遍历行、递增列并在最后一行之后重置行)而不是只给你指定的行/列,从而导致你的观察结果。

w9apscun

w9apscun3#

(:)沿着列对矩阵进行矢量化,即沿列读取元素并将其连接为单个列向量。a:b:c返回从ac的数字序列,增量为b。如果省略b,则默认设置为1
序列a:b:c可用于沿着列线性索引矩阵。如果用于索引多维数组,则它沿该维度选择元素。

I(1,2:3)

返回由I的行1和列2:3组成的矩阵,即[1 3]
同样,我们可以用任何方式得到一个索引,并用它来索引I。

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

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

相关问题