在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中的行。
谢谢。
编辑:重写问题,以便(希望)不那么混乱。
答案 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。