这是一个简单的问题,但我却始终找不到答案。
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中。
matrix
和rbind
意味着每次迭代每个(嵌套)循环时都会将数据复制到新对象中。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
一行一行地构建矩阵不是编码的最有效方式(因为矩阵在扩展时需要重新分配内存!)。然而,这是可以做到的。看一下下面的玩具示例:
> 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
if (!exists("XM")) {
XM = matrix(X, ncol = length(X))
} else
{
XM = rbind(XM, X)
}
if (exists("XM")) rm("XM")