R 使用两个等长向量为行和列索引索引矩阵
假设您有一个5x5矩阵,并希望使用两个等长向量选择值,一个表示索引行,另一个表示索引列:R 使用两个等长向量为行和列索引索引矩阵,r,matrix,subset,R,Matrix,Subset,假设您有一个5x5矩阵,并希望使用两个等长向量选择值,一个表示索引行,另一个表示索引列: m <- matrix(1:25, ncol = 5) R <- c(1, 3, 5) C <- c(2, 4, 4) 但这构造了一个大小为length(R)*length(C)的矩阵,因此,如果R和C都很长,则速度很慢 如何做到这一点?使用mapply mapply(function(r,c) {m[r,c]}, r = R, c = C) # [1] 6 18 20 创建索引矩阵
m <- matrix(1:25, ncol = 5)
R <- c(1, 3, 5)
C <- c(2, 4, 4)
但这构造了一个大小为length(R)*length(C)
的矩阵,因此,如果R和C都很长,则速度很慢
如何做到这一点?使用
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
您可以使用cbind(R,C)
对[
进行索引:
m[cbind(R,C)]
#> [1] 6 18 20
另一个选项是
M[do.call(cbind, list(R, C))]
我尝试了两种不同的
apply
解决方案,您使用diag
的解决方案比OP的解决方案快得多。在我看来,在5x5的矩阵和10000长度的索引向量上,使用索引矩阵的解决方案非常出色。有人可能有更好的解决方案。请等待一段时间,比较它们看看哪一个是最好的。然后接受这个解决方案。我可能很快就会和你谈,我想这取决于你的时间安排。你做了很多次迭代,增加索引向量,还是增加矩阵?如果你有一个小矩阵和大索引向量,那么这看起来更快
M[do.call(cbind, list(R, C))]