2013-12-22 25 views
5

これは簡単な問題ですが、私の人生にとって私は答えを見つけることができません。マトリックスに新しい行を1つずつ追加してください

for (w in 1:47) { 
    s <- w + 1; 

    while(s < 49) { 
     xx <- wcc(x$codes[w,], x$codes[s,], 20) 
     C = matrix(rbind(w,s,xx), nrow=1128, ncol=3, byrow=TRUE) 
     s <- s + 1; 
    } 
} 

このループでは、XXを行列Cに1つずつ入れたいと思います。

+2

お願いします[再現可能](http://stackoverflow.com)/a/5963610/1315767) –

答えて

3

行列を一度に1行作成するのは非常に効率的な方法ではありません(行列が展開されているので、メモリの再割り当てが必要になります)。しかし、それは行うことができます。次のおもちゃの例を見てください。

> C = c(0, 0, 1) 

> for (n in 1:10) { 
+ x <- c(n, 2*n, n+1) 
+ C <- rbind(C, x) 
+ } 
> C 
    [,1] [,2] [,3] 
C 0 0 1 
x 1 2 2 
x 2 4 3 
x 3 6 4 
x 4 8 5 
x 5 10 6 
x 6 12 7 
x 7 14 8 
x 8 16 9 
x 9 18 10 
x 10 20 11 

Cはベクトルとして開始します。 rbind()を呼び出すたびに、別の行が行列に追加されます。明らかに、新しい行は、既存の行列にある列と同数の列を持たなければなりません。

また、事前割当の問題を回避するためにrbind()を使用する場合は、リスト内のデータを組み立てることができます(再割り当てのペナルティがなく、要素の数を前もって決定する必要もありません)。完了したら行列に変換します。

> C = list() 
> 
> for (n in 1:10) { 
+ C[[n]] <- c(n, 2*n, n+1) 
+ } 
> 
> do.call(rbind, C) 
     [,1] [,2] [,3] 
[1,] 1 2 2 
[2,] 2 4 3 
[3,] 3 6 4 
[4,] 4 8 5 
[5,] 5 10 6 
[6,] 6 12 7 
[7,] 7 14 8 
[8,] 8 16 9 
[9,] 9 18 10 
[10,] 10 20 11 
+1

少なくとも事前割り当てを教えてください... – Roland

+0

または問題を回避してください! – DataWookie

12

最終的なマトリックスを事前に割り当てることは、実行しているよりもはるかに効率的です。 matrixrbindを呼び出すと、それぞれの(ネストされた)ループを反復処理するたびに、新しいオブジェクトにデータが繰り返しコピーされます。

最終的なサイズがわからなくても、最終的なマトリックスを過大評価すると時間が節約されます。いくつかの議論のためにSee here。あなたは完全に出力オブジェクトを構築スキップしてちょうどsapply使用することができ、また

iter <- 10 
out <- matrix(NA, nrow=iter, ncol=3) 

for (n in 1:iter) 
    out[n,] <- c(n, 2*n, n+1) 

t(sapply(1:iter, function(n) c(n, 2*n, n+1))) 

あなたは素敵な行列を得るいずれかの方法を

はここでこれを行う方法の簡単な例です:

 [,1] [,2] [,3] 
[1,] 1 2 2 
[2,] 2 4 3 
[3,] 3 6 4 
[4,] 4 8 5 
[5,] 5 10 6 
[6,] 6 12 7 
[7,] 7 14 8 
[8,] 8 16 9 
[9,] 9 18 10 
[10,] 10 20 11 
関連する問題