# sample data
N <- 100
s <- matrix(rexp(1000000), 10000)
sif <- matrix(0,1,N)
count <- 0
# the slow for loop
for(ii in 1:(round(length(s)/N)-1))
{
# incdex counter for final vector
count <- count + 1
# populates new matrix with a range from the s matrix
sif[count,] <- s[(1+((ii-1)*N)):(ii*N)]
# stacks new row onto matrix
sif <- rbind(sif, (count + 1))
}
矩阵中有100万个元素,性能非常慢。有人知道如何对上述样本进行矢量化吗?
答案 0 :(得分:4)
你不是在做什么
sif <- matrix(s, ncol=N, byrow=T)
如果新矩阵的元素数与旧矩阵的元素数完全不匹配,则必须要小心。然后,以下将做:
sif <- matrix(s[1:(round(length(s)/N)*N)], ncol=N, byrow=T)
我做了一个仔细的计算,调用我的结果sif2
。我得到了什么:
> max(abs(sif[1:9999,1:100]-sif2[1:9999,1:100]))
[1] 0
然而,
> sif[10000,]
[1] 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 ...
当然,因为您从未填写数据的最后一行。这是有意的吗?如果是,您可以通过
轻松更改我的结果sif2[nrow(sif2), ] <- nrow(sif2)
没有必要比较性能,但为了完整起见:
User System elapsed
Your way 57.831 14.056 71.525
R's way 0.004 0.002 0.006