逐行向矩阵添加新行

9

这是一个简单的问题,但我却始终找不到答案。

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
请确保您的问题是可重现的 reproducible - Jilber Urbina
3个回答

16
预先分配最终矩阵要比您目前的做法更有效。重复调用matrixrbind意味着每次迭代每个(嵌套)循环时都会将数据复制到新对象中。
即使您不知道所需的最终大小,过度估计最终矩阵也会节省时间。参见此处进行一些讨论。
以下是如何执行此操作的简单示例:
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

10

一行一行地构建矩阵不是编码的最有效方式(因为矩阵在扩展时需要重新分配内存!)。然而,这是可以做到的。看一下下面的玩具示例:

> 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
绕过这个问题! - datawookie

0
这是一个示例,矩阵是基于模式创建的,该模式是第一行。要包括的行是 X。
if (!exists("XM")) {
  XM = matrix(X, ncol = length(X))
} else
{
  XM = rbind(XM, X)
}

在初始化过程中,我们需要删除XM(以确保):
if (exists("XM")) rm("XM") 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接