0

这是示例代码

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

4

1 回答 1

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  
于 2013-06-06T05:30:00.757 回答