使用GNU Octave / MATLAB中的向量的索引数组列

时间:2015-12-26 00:46:36

标签: arrays matlab indexing

在GNU Octave / MATLAB中进行编码我遇到了这个简单的问题,我自己也搞不清楚:我试图通过使用存储在一个索引中的一些索引来选择一些矩阵元素。阵列。让我用一个例子说清楚:

假设:

A = zeros(5, 3)

0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

我想通过使用辅助数组B中的值作为子指示,逐行选择A矩阵中的一些元素。

IE中。以下B数组

B = [ 1 3 2 1 3 ]'

1
3
2
1
3

应该被理解为:

1 -> index '1' on first row  (element [1, 1])
3 -> index '3' on second row (element [2, 3])
2 -> index '2' on third row  (element [3, 2])
1 -> index '1' on fourth row (element [4, 1])
3 -> index '3' on fifth row  (element [5, 3])

因此,如果我们为使用上述标准选择的元素赋值'1',结果矩阵将为:

1   0   0
0   0   1
0   1   0
1   0   0
0   0   1

我相信这是一个简单的操作,我确信必须有一种方法来实现所描述的行为,而不必遍历矩阵A中的行。

谢谢。

编辑:重写问题,以便(希望)不那么混乱。

1 个答案:

答案 0 :(得分:0)

你的问题有点令人困惑。您是说要通过使用向量B中的值作为列索引来选择A中的元素,但是您的示例在矩阵A中设置(未获取)新值。我将解释这两种情况。

考虑这个矩阵

A = magic(5)

17   24    1    8   15
23    5    7   14   16
 4    6   13   20   22
10   12   19   21    3
11   18   25    2    9

假设您想获得/设置A的对角线元素。

在这种情况下,索引对是[1,1],[2,2],[3,3],[4,4]和[5,5]。

要将元素作为向量访问,请运行此

A(sub2ind([5,5], (1:5)',(1:5)'))

17
 5
13
21
 9

设置元素运行

A(sub2ind([5,5], (1:5)',(1:5)')) = 0

 0   24    1    8   15
23    0    7   14   16
 4    6    0   20   22
10   12   19    0    3
11   18   25    2    0

这些命令可以写成

r = 1:5
c = 1:5
A(sub2ind([max(r),max(c)], r',c'))
# to assign values
A(sub2ind([max(r),max(c)], r',c')) = 0
# and to assign different value to each index pair
A(sub2ind([max(r),max(c)], r',c')) = [20 10 50 12 99]

在您的示例中,

r = 1:5
c = B'
A(sub2ind([max(r),max(c)], r',c')) = 1
# or simply A(sub2ind([max(r),max(B)], r',B)) = 1

1   0   0
0   0   1
0   1   0
1   0   0
0   0   1

您可以阅读sub2ind的工作原理here