-2

最初は次のような行列呼び出し 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[indexes,] <- 1 のようなことをしたいと思っています。しかし、これは私が望んでいたことではありません。

4

3 に答える 3

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

2 番目の方法の方が若干速いようです。

于 2013-06-18T21:06:09.710 に答える
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
于 2013-06-18T21:10:13.750 に答える
0

前の質問に対する回答を使用して、行インデックスのベクトルを作成しridx、次に

res[as.logical(ridx),] = 1L
于 2013-06-18T21:56:43.670 に答える