如何在使用cbind循环R中创建一个空矩阵

时间:2014-03-11 04:07:00

标签: r matrix cbind

我想为R中的每一步生成cbind矩阵,如何在matlab中创建一个初始的空矩阵,然后在每次迭代时创建cbind?

2 个答案:

答案 0 :(得分:5)

在循环中使用cbind非常慢。如果您事先知道大小,则可以预先分配矩阵并填充循环中的列。否则,请使用list。创建一个空列表,并将向量添加到循环中的列表中。然后,在循环结束后将列表cbind到一个矩阵中。

时序:

Preallocate matrix:
   user  system elapsed 
  1.024   0.064   1.084

Grow matrix with cbind:
   user  system elapsed 
 76.036  50.146 125.840

Preallocate list:
   user  system elapsed 
  0.788   0.040   0.823

Grow list by indexing:
   user  system elapsed 
  0.821   0.043   0.859 

代码:

# Preallocate matrix.
f1 = function(x) {
    set.seed(2718)
    mat = matrix(ncol=x, nrow=x)
    for (i in 1:x) {
        mat[, i] = rnorm(x)
    }
    return(mat)
}

# Grow matrix with cbind.
f2 = function(x) {
    set.seed(2718)
    mat = c()
    for (i in 1:x) {
        mat = cbind(mat, rnorm(x))
    }
    return(mat)
}

# Preallocate list.
f3 = function(x) {
    set.seed(2718)
    lst = vector("list", length=x)
    for (i in 1:x) {
        lst[[i]] = rnorm(x)
    }
    res = do.call(cbind, lst)
    return(res)
}

# Grow list by indexing.
f4 = function(x) {
    set.seed(2718)
    lst = list()
    for (i in 1:x) {
        lst[[i]] = rnorm(x)
    }
    res = do.call(cbind, lst)
    return(res)
}

x = 3000

system.time(r1 <- f1(x))
system.time(r2 <- f2(x))
system.time(r3 <- f3(x))
system.time(r4 <- f4(x))

all.equal(r1, r2)
all.equal(r1, r3)
all.equal(r1, r4)

答案 1 :(得分:1)

这将创建一个包含全1的100x10矩阵。它应该让你了解这些东西的一般形式。

my.matrix <- c()
for(i in 1:10){
    my.matrix <- cbind(my.matrix, rep(1,100))
}