如何快速有效地计算R中的0和0的大矩阵

时间:2017-01-15 00:59:51

标签: r matrix sparse-matrix

我已经使用R一段时间了,但在优化代码性能方面并不是很好。

给定长度为Y的向量t,我正在尝试生成订单t的方阵,以使其i行对应$ 1_ {Y_i<所有j = 1, 2, ..., t的Y_j} $。所以这是一个0/1的二进制矩阵。

Y <- matrix(0, length(t), length(t))
for(i in 1:length(t))  Y[i, ] <- (t[i] <= t)

但是,我不相信这是最有效的方法,主要是看对象的大小。它的大小(以字节为单位)与密集矩阵相同。我的目标是将其扩展为大t,但我相信这种矩阵的计算速度和存储空间将花费太长时间。有没有更快更有效的方法来存储和计算这个矩阵?

1 个答案:

答案 0 :(得分:4)

如果我理解正确,我们可以使用:

outer(t, t, "<=") + 0L
## operator `"<="` returns TRUE / FALSE logical, 
## add an integer 0 to make a 0 / 1 binary integer matrix

让我们快速测试,与您的参考for循环进行比较。

set.seed(0); t <- runif(5)  ## reproducible data

outer(t, t, "<=") + 0L
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    0    0    1
#[2,]    1    1    1    1    1
#[3,]    1    0    1    1    1
#[4,]    1    0    0    1    1
#[5,]    0    0    0    0    1

Y <- matrix(0, nrow=length(t), ncol=length(t))
for(i in 1:length(t)) {
  Y[i, ] <- t[i] <= t
}

Y
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    0    0    1
#[2,]    1    1    1    1    1
#[3,]    1    0    1    1    1
#[4,]    1    0    0    1    1
#[5,]    0    0    0    0    1

我们得到相同的结果。宾果!!

注意:

人们已经阅读了这个答案的编辑历史。给出了sparseMatrix的方法。我最初认为使用稀疏矩阵和柱旋转将提高效率,但没有。基准测试显示outer的速度提高了6倍或更多。因此,虽然我感到非常难过,但我不得不把我的大部分答案都丢掉。