重构/矢量化一个简单的for循环(包括示例数据和循环)

时间:2013-06-06 05:13:10

标签: r

以下是示例代码

# 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万个元素,性能非常慢。有人知道如何对上述样本进行矢量化吗?

1 个答案:

答案 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