我最初有一个矩阵调用res,如下所示:
[,1] [,2]
[1,] 0 0
[2,] 0 0
[3,] 0 0
[4,] 0 0
[5,] 0 0
[6,] 0 0
[7,] 0 0
[8,] 0 0
[9,] 0 0
[10,] 0 0
我有一个索引矩阵(索引),如下所示:
[,1] [,2]
[1,] 2 3
[2,] 7 9
我希望得到的res矩阵如下所示:
[,1] [,2]
[1,] 0 0
[2,] 1 1
[3,] 1 1
[4,] 0 0
[5,] 0 0
[6,] 0 0
[7,] 1 1
[8,] 1 1
[9,] 1 1
[10,] 0 0
我有一个大矩阵,循环索引矩阵需要很长时间。如果有更好的方法,请告诉我。我希望做像mat [index,]< - 1这样的事情。但是,这不是我想要的。
答案 0 :(得分:2)
如果您的主矩阵和res
是索引矩阵,则indexes
:
这可能有所帮助:
idx <- do.call("c",apply(indexes,1,function(x){seq(x[1],x[2])}))
res[idx,] <- 1
关于时间安排,首先要创建一个大的索引矩阵:
> set.seed(42)
> indexes <- t(matrix(sort(sample(1:10000,1000)),2,500))
> head(indexes)
[,1] [,2]
[1,] 3 4
[2,] 14 16
[3,] 23 33
[4,] 40 63
[5,] 67 74
[6,] 79 83
并计时:
> system.time(idx <- do.call("c",apply(indexes,1,function(x){seq(x[1],x[2])}))) user system elapsed
0.008 0.000 0.007
> system.time( idx2 <- unlist( apply( indexes , 1 , FUN = function(x){ seq.int(x[1],x[2])}) ))
user system elapsed
0.004 0.000 0.002
看起来第二种方法稍快一些。
答案 1 :(得分:0)
test <- matrix(rep(0,1E7), ncol=2)
Index <- matrix(sort(sample(1:(1E7*0.5), size=10000)), ncol=2, byrow=TRUE)
test[unlist(apply(Index, 1, function(x){x[1]:x[2]})),] <- 1
答案 2 :(得分:0)
使用previous question的答案创建行索引ridx
的向量,然后
res[as.logical(ridx),] = 1L