我已经使用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
,但我相信这种矩阵的计算速度和存储空间将花费太长时间。有没有更快更有效的方法来存储和计算这个矩阵?
答案 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倍或更多。因此,虽然我感到非常难过,但我不得不把我的大部分答案都丢掉。