2013-12-22 69 views
5

這是一個簡單的問題,但對於我的生活,我無法找到答案。向矩陣逐個添加新行

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中。

+2

請讓你的問題[重複性(http://stackoverflow.com/a/5963610/1315767) –

回答

3

一次構建一行矩陣不是一種非常有效的編碼方式(因爲矩陣正在擴展,所以需要重新分配內存!)。但是,它可以完成。看看下面的玩具例子:

> 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進行一些討論。

這裏有一個如何做一個簡單的例子:

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

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

或者,你可以跳過完全構造輸出對象,只是使用sapply

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