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

3
在GNU Octave/MATLAB编程中,我遇到了一个简单的问题,自己无法解决:我正在尝试使用存储在数组中的一些索引来选择矩阵的某些元素。让我们通过一个例子来清楚地说明这个问题:
给定:
A = zeros(5, 3)

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

我希望能够使用辅助数组B的值作为下标,按行选择矩阵A中的一些元素。即,选择如下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
这些索引确实是错误的!Matlab 怎么知道 3 是指第一行还是第三行呢?将它们索引为 A(1:5,B) 可能会起作用。 - Ander Biguri
问题有点混乱,请您重新表述或者删除它。 - smci
@smci 我已经尽力了,如果你还觉得困惑,请随意编辑它。 - poinu
啊,你的意思是稀疏矩阵转换为密集矩阵。 - smci
1个回答

1
你的问题有点混淆。你想使用向量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

我的问题确实有点混淆。我应该询问“获取/设置”元素而不是“选择”。这个解决方案非常详细,完美地解决了我的问题,非常感谢。最后,我想说表达式A(sub2ind([max(r),max(c)], r',c'))可能应该改为A(sub2ind(size(A), r',c'))或者至少类似于A(sub2ind([size(A, 1) ,max(c)], r',c'))。否则,如果r不包含指向最后一行的索引,则sub2ind计算出的索引将不正确(因为GNU Octave/MATLAB线性索引的方式)。 - poinu

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