Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用两个等长向量为行和列索引索引矩阵_R_Matrix_Subset - Fatal编程技术网

R 使用两个等长向量为行和列索引索引矩阵

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 创建索引矩阵

假设您有一个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(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))]