0

dist()最初のステップとして、入力行列の各行の計算などを行い、スクリプトの 2 番目のステップとして、ステップ 1 で取得した出力行列の各ペアを使用して別の行列を作成する R スクリプトを作成しようとしています。計算。私の問題は、ステップ1から取得したすべてのマトリックスを「保存」できないことです。誰か良い戦略を教えてくれませんか?

私のコードは次のようになります。

n<- nrow (aa)
output <- matrix (0, n, n)
for (i in 1:n)
{
    for (j in i:n)
    {
        akl<- function (dii){
            ddi<- as.matrix (dii)
            m<- rowMeans(ddi)
            M<- mean(ddi)
            r<- sweep (ddi, 1, m)
            b<- sweep (r, 2, m)
            return (b + M)  
            }
        A<- akl(dist(aa[i,]))
        B<- akl(dist(aa[j,]))
            V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
        if (V > 0) {
            output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
            }
    }
}   

akl関数からすべての結果の行列を取得し、残りの計算に使用したいと思います。ここに示すスクリプトは、毎回 akl を計算し、大きな入力行列が問題になるため、時間がかかりすぎます。

4

2 に答える 2

3

jループの内側でAを再計算する必要はなく、外側に持っていきます。

また、ループ内の関数を毎回再定義する必要はありません(ループ内の関数に依存しないと仮定します)。

n<- nrow (aa)
output <- matrix (0, n, n)
akl<- function (dii){
            ddi<- as.matrix (dii)
            m<- rowMeans(ddi)
            M<- mean(ddi)
            r<- sweep (ddi, 1, m)
            b<- sweep (r, 2, m)
            return (b + M)  
            }
for (i in 1:n)
{
    A<- akl(dist(aa[i,]))
    for (j in i:n)
    {
        B<- akl(dist(aa[j,]))
            V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
        if (V > 0) {
            output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
            }
    }
}   

それを試して、テストを実行して(テストを作成しましたよね?)、見てください。

于 2013-01-09T16:47:31.973 に答える
0

コードを改善したので、コンパイラパッケージを調べます。enablejit(3)でコンパイラーを利用することにより、多くのループを伴うスクリプトから時間を節約することができます。

于 2013-01-10T00:20:21.213 に答える