这是一个简单的问题,但对于我的生活,我找不到答案.
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
预分配最终矩阵将比您正在进行的操作更有效.每次遍历每个(嵌套)循环时,调用matrix并rbind重复意味着将数据复制到新对象.
即使您不知道所需的最终尺寸,过高估计最终矩阵也可以节省您的时间.请参阅此处进行讨论.
这是一个如何执行此操作的简单示例:
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)
一次建立一个矩阵不是一种非常有效的编码方式(因为矩阵正在扩展,因此需要重新分配内存!)。但是,可以做到。看下面的玩具示例:
> 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)
| 归档时间: |
|
| 查看次数: |
39734 次 |
| 最近记录: |