在Matlab中,使用矩阵索引向量时感到困惑。

3
以下代码在Matlab中运行:
a = [1 2 3 4]
b = [ 1 2 3; 1 2 3; 1 2 3]
a(b)

一个(a)的结果是一个矩阵:

[ 1 2 3; 1 2 3; 1 2 3]

有人能解释一下这里发生了什么吗?为什么一个向量可以通过一个矩阵进行索引,如何解释结果?

3
如果 x=a(b),那么 x(i,j) 等于 a(b(i,j)) - howard
2个回答

3
那是一个非常标准的MATLAB操作。当你有一个向量或矩阵时,你可以提供另一个向量或矩阵来访问特定的值。在MATLAB中访问值不仅限于单个索引(即A(1)、A(2)等)。
例如,你有一个向量a=[1 2 3 4]。当你尝试使用b来访问向量时,你实际上是在查找。输出基本上与b的大小相同,你所做的是创建一个矩阵,其中有3行,每个元素都访问第一个、第二个和第三个元素。不仅可以对向量进行此操作,还可以对矩阵进行此操作。
请注意,当你对矩阵进行此操作时,你按列主序格式访问元素。例如,假设我们有这个矩阵:
 A = [1 2
      3 4
      5 6
      7 8]
A(1) 的值为1,A(2) 的值为3,A(3) 的值为5等等。你将从第一列开始,随着索引的增加依次向下遍历第一列。一旦到达第5个索引位置,它就会跳到下一列。所以A(5) 的值为2,A(6) 的值为4等等。
以下是一些示例,以帮助你更好地理解。让我们定义一个矩阵A,如下所示:
 A = [5 1 3
      7 8 0
      4 6 2]

以下是一些MATLAB代码,可以帮助您加强对这种索引方式的理解:

 A = [5 1 3; 7 8 0; 4 6 2]; % 3 x 3 matrix
 B = [1 2 3 4];
 C = A(B); % C should give [5 7 4 1]
 D = [5 6 7; 1 2 3; 4 5 6];
 E = A(D); % E should give [8 6 3; 5 7 4; 1 8 6]
 F = [9 8; 7 6; 1 2];
 G = A(F); % G should give [2 0; 3 6; 5 7]

因此,当您以此方式访问元素时,输出结果将是您指定为参数的向量或矩阵的大小。
为了完整起见,让我们以向量为例:
 V = [-1 9 7 3 0 5]; % A 6 x 1 vector
 B = [1 2 3 4];
 C = V(B); % C should give [-1 9 7 3]
 D = [1 3 5 2];
 E = V(D); % E should give [-1 7 0 9]
 F = [1 2; 4 5; 6 3];
 G = V(F); % G should give [-1 9; 3 0; 5 7]

NB: 请确保您不提供超出范围的索引。例如,在您的示例中,如果尝试指定索引为5,则会产生错误。同样,如果在我的示例中尝试使用大于9的任何值,也会导致错误。该3 x 3 矩阵中有9个元素,因此指定大于9的列主索引将导致越界错误。


1
好的回答。我喜欢将扩展到A作为矩阵的解释,+1。 - MattG
1
谢谢!很高兴在这里遇到来自GTA的人。希望多伦多大学很棒。 - rayryeng
1
你在哪里读本科?我正在为机器人的LIDAR导航写第四年的论文。你正在开发的Bubl相机看起来可能有一些很酷的机器人应用。 - MattG
我在莱尔森完成了我的三个学位,分别是电子与计算机工程。哦,当然!如果你查看我们的网站,我们把Bublcam放在一架空中无人机上,并拍摄了城市的360度全景视频。http://bublcam.com/portfolio/bubl-takes-flight/。祝你论文顺利,马特!LIDAR导航非常棒,有许多好的实际应用。 - rayryeng

2
注意,a(b)的返回值与b的大小相同。 a(b)简单地将b的每个元素(记为b(i,j))作为索引,并返回输出a(b(i,j))作为一个与b大小相同的矩阵。您应该尝试其他示例,以更直观地了解这一点:
b = [4 4 4; 4 4 4];
a(b) % Will return [4 4 4; 4 4 4]
c = [5; 5];
a(c) % Will error as 5 is out of a's index range

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接