这是一个简单的问题,但对于我的生活,我找不到答案。
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.
答案 0 :(得分:14)
预分配你的最终矩阵将比你正在做的更有效率。每次迭代每个(嵌套)循环时,重复调用matrix
和rbind
意味着将数据复制到新对象。
即使您不知道所需的最终尺寸,过高估计最终矩阵也会节省您的时间。 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")