逐个向矩阵添加新行

use*_*553 6 r matrix

这是一个简单的问题,但对于我的生活,我找不到答案.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个循环中,我想将XX逐个放入矩阵C中.

Tho*_*mas 14

预分配最终矩阵将比您正在进行的操作更有效.每次遍历每个(嵌套)循环时,调用matrixrbind重复意味着将数据复制到新对象.

即使您不知道所需的最终尺寸,过高估计最终矩阵也可以节省您的时间.请参阅此处进行讨论.

这是一个如何执行此操作的简单示例:

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

for (n in 1:iter)
  out[n,] <- c(n, 2*n, n+1)
Run Code Online (Sandbox Code Playgroud)

或者,您可以完全跳过构造输出对象,只需使用sapply:

t(sapply(1:iter, function(n) c(n, 2*n, n+1)))
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,你得到一个很好的矩阵:

      [,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
Run Code Online (Sandbox Code Playgroud)


Dat*_*kie 6

一次建立一个矩阵不是一种非常有效的编码方式(因为矩阵正在扩展,因此需要重新分配内存!)。但是,可以做到。看下面的玩具示例:

> 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)