【问题标题】:Index array columns using vectors in GNU Octave/MATLAB [duplicate]在 GNU Octave/MATLAB 中使用向量索引数组列 [重复]
【发布时间】:2016-03-31 18:35:41
【问题描述】:

在 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 中的行。

谢谢。

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

【问题讨论】:

  • 这些索引确实是错误的! Matlab 应该如何知道 3 是指第一行还是第三行的 3。将它们索引为 A(1:5,B) 并且它可能会起作用
  • 问题比较混乱,能否重写或删除?
  • @smci 我已经尽力了,如果您仍然感到困惑,请随时进一步编辑。
  • 啊,你的意思是稀疏矩阵到密集矩阵的转换。

标签: arrays matlab indexing


【解决方案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 线性索引是如何完成的)。
猜你喜欢
  • 2011-01-28
  • 2016-07-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多