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 に答える