gpt4 book ai didi

r - 如何用值向量填充索引矩阵

转载 作者:行者123 更新时间:2023-12-04 22:04:38 25 4
gpt4 key购买 nike

我有一个矩阵 (m.idx),其中包含要索引的向量的位置元素。

> m.idx
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 3 4 5 6 7
[3,] 5 6 7 8 9

假设 x 是我的向量。
x <- c(9,3,2,5,3,2,4,8,9)

我想用 x 的相应位置元素重新填充矩阵索引。

所以我会...
> m.pop
[,1] [,2] [,3] [,4] [,5]
[1,] 9 3 2 5 3
[2,] 2 5 3 2 4
[3,] 3 2 4 8 9

我可以通过以下方式以笨拙的方式做到这一点。
> m.pop <- t(matrix(t(matrix(x[c(t(m.idx))])),ncol(m.idx),nrow(m.idx)))

> m.pop
[,1] [,2] [,3] [,4] [,5]
[1,] 9 3 2 5 3
[2,] 2 5 3 2 4
[3,] 3 2 4 8 9

但似乎可能有一种更简单的方法来索引这些值。
执行此操作的最佳(对于大型集合也是最快/最有效的)方法是什么?

最佳答案

怎么样:

m.idx[] <- x[m.idx]
m.idx
# [,1] [,2] [,3] [,4] [,5]
# [1,] 9 3 2 5 3
# [2,] 2 5 3 2 4
# [3,] 3 2 4 8 9

或者,如果您不想覆盖 m.idx 矩阵,您可以这样做:
m.pop <- m.idx
m.pop[] <- x[m.pop]

添加:

另一种使用 structure 的方法也非常快:
structure(x[m.idx], .Dim = dim(m.idx))
# [,1] [,2] [,3] [,4] [,5]
# [1,] 9 3 2 5 3
# [2,] 2 5 3 2 4
# [3,] 3 2 4 8 9

当应用于 Ananda Mahto's answer 中的大型 m.idx 矩阵时,我机器上的时间是
fun5 <- function() structure(x[m.idx], .Dim = dim(m.idx))
microbenchmark(fun1(), fun2(), fun3(), fun4(), fun5(), times = 10)
# Unit: milliseconds
# expr min lq median uq max neval
# fun1() 303.3473 307.2064 309.2275 352.5076 353.6911 10
# fun2() 548.0928 555.3363 587.6144 593.4492 596.5611 10
# fun3() 480.6181 487.5807 507.5960 529.9696 533.0403 10
# fun4() 1222.6718 1231.3384 1259.8395 1269.6629 1292.2309 10
# fun5() 401.8450 403.7216 432.7162 455.4638 487.1755 10
identical(fun1(), fun5())
# [1] TRUE

可以看到 structure 在速度上其实还不算太差。

关于r - 如何用值向量填充索引矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com