我有一个矩阵(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
Run Code Online (Sandbox Code Playgroud)
假设x是我的向量.
x <- c(9,3,2,5,3,2,4,8,9)
Run Code Online (Sandbox Code Playgroud)
我想用相应的位置元素重新填充矩阵索引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
Run Code Online (Sandbox Code Playgroud)
我可以用以下方式以一种笨拙的方式做到这一点.
> 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
Run Code Online (Sandbox Code Playgroud)
但似乎可能有一种更容易的方法来索引值.这样做的最佳方法是什么(最快/最有效的大型套装)?
matrix(x[m.idx],ncol=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 9 3 2 5 3
[2,] 2 5 3 2 4
[3,] 3 2 4 8 9
Run Code Online (Sandbox Code Playgroud)
怎么样:
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
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想覆盖m.idx矩阵,则可以执行以下操作:
m.pop <- m.idx
m.pop[] <- x[m.pop]
Run Code Online (Sandbox Code Playgroud)
添加:
另一种使用方法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
Run Code Online (Sandbox Code Playgroud)
m.idx在Ananda Mahto的答案中应用于大矩阵时,我的机器上的时间是
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
Run Code Online (Sandbox Code Playgroud)
你可以看到structure在速度方面实际上并没有太糟糕.