【问题标题】:Index a matrix using two equal-length vectors for row and column indices使用两个等长向量作为行和列索引的矩阵索引
【发布时间】:2020-07-08 10:48:25
【问题描述】:

假设您有一个 5x5 矩阵,并希望使用两个等长向量来选择值,一个代表索引行,另一个代表索引列:

m <- matrix(1:25, ncol = 5)
R <- c(1, 3, 5)
C <- c(2, 4, 4)

此处所需的输出是6(第 1 行第 2 列)、18(第 3 行第 4 列)、20(第 5 行第 4 列)的单个向量。

我能想到的最好的是:

diag(m[R,C])

但这会构造一个大小为length(R) * length(C) 的矩阵,因此如果 R 和 C 很长,则速度会很慢。

你是怎么做到的?

【问题讨论】:

  • 我尝试了几种不同的apply 解决方案,而您使用diag 的解决方案要快得多

标签: r matrix subset


【解决方案1】:

使用mapply

mapply(function(r,c) {m[r,c]}, r = R, c = C)
# [1]  6 18 20

为索引创建一个矩阵。

m[matrix(c(R,C), ncol=2)]
# [1]  6 18 20

【讨论】:

  • 比OP的解决方案慢很多
  • 在 5x5 矩阵和长度为 10,000 的索引向量上对我来说似乎更快
  • 索引矩阵的解决方案非常棒
  • 有人可能有更好的解决方案。等待一段时间,比较它们,看看哪一个是最好的。然后接受解决方案。
  • 我可能很快就和我谈过了,我想这取决于你如何安排时间。您是否进行了多次迭代、增加索引向量或增加矩阵?如果你有一个小矩阵和大索引向量,那么这似乎更快
【解决方案2】:

您可以使用cbind(R, C)[ 进行索引:

m[cbind(R,C)]

#> [1]  6 18 20

【讨论】:

    【解决方案3】:

    另一种选择是

    M[do.call(cbind, list(R, C))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 2022-11-02
      • 2016-06-22
      • 2016-04-24
      相关资源
      最近更新 更多