2016-10-14 9 views
0

計算が必要な非常に大きな行列があります。 forループはRが非常に遅いので、よりスマートな関数に置き換えたいと思います。大きな行列のforループを回避するR

ここでは、小さなサンプル行列で書いたforループを示します。

d <- matrix(c(1,1,0,0,1,1,1,0,0), 3,3) 
for (i in 1:nrow(d)) { 
    for (j in 1:ncol(d)) { 
    if (d[i,j] == 1) { 
     d[j, i] =1 
    } else {d[j,i] = 0} 
    } 
} 

このコードはうまくここでD [I、J] = D [jは、i]は対称行列を得、望むような値を置き換えます。しかし、行列が大きいときには多くの時間とメモリが必要になります。それを達成するための効率的な代替手段は何でしょうか?ありがとうございました!!これはあなたに、対称行列を与えるどのようにこの程度

d[lower.tri(d)] <- (t(d)[lower.tri(d)] == 1) 

答えて

5

。代わりに転置の下三角を取ります。あなたは上の三角形の行を賢明に読むが、d[upper.tri(d)]は列の値を返します。一方、転置の下三角を取ることは上三角を横列で読むことと等価である。

d[upper.tri(d)]t(d)[lower.tri(d)]の両方が0 1 0を返すため、指定した例では、上三角形をうまく処理できます。

d <- matrix(c(1,1,0,1,0,1,0,0,0, 1,0,1,0,1,0,1), 4,4) 

この場合、d[upper.tri(d)]0 0 0 1 1 0を返します0 0 1 0 1 0t(d)[lower.tri(d)]一方を返します。だからここに大きな行列との比較です。

比較:

d2 <- d 
d2[lower.tri(d2)] <- (t(d2)[lower.tri(d2)] == 1) 

for (i in 1:nrow(d)) { 
    for (j in 1:ncol(d)) { 
     if (d[i,j] == 1) { 
      d[j, i] =1 
     } else {d[j,i] = 0} 
    } 
} 

all.equal(d2, d) 
## TRUE 
+0

ありがとうございました。これは私の問題を解決します。 – achimneyswallow

関連する問題