逐个向矩阵添加新行

时间:2013-12-22 14:38:42

标签: 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;
    }
}

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

3 个答案:

答案 0 :(得分:14)

预分配你的最终矩阵将比你正在做的更有效率。每次迭代每个(嵌套)循环时,重复调用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

答案 1 :(得分:5)

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

> 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

答案 2 :(得分:0)

这里是一个示例,其中根据模式(第一行)创建矩阵。要包含的行是X。

if (!exists("XM")) {
  XM = matrix(X, ncol = length(X))
} else
{
  XM = rbind(XM, X)
}

在初始化中,我们需要删除XM(请确保):

if (exists("XM")) rm("XM")