2013-01-14 9 views
8

forループ内にm * n行列の単一スロットにアクセスして割り当てる必要があります。これまでコード:行列の対角線のエントリに値を代入する

rowCount <- 9 
similMatrix = matrix(nrow = rowCount - 1, ncol = rowCount) 
show(similMatrix) 
for(i in (rowCount - 1)){ 
    for (j in rowCount) 
    if (i == j){ 
     similMatrix[i == j] <- 0; 
    } 
} 
show(similMatrix) 

私はjはIF =ので、マトリックス中にNA値が0

+0

はあなたではありません希望の出力を得る? –

答えて

10

機能が欲しいです"対角"要素をゼロに設定すると、すでに回答が得られていますが、もっと一般的なものを望んでいるのだろうかと思います。そのコードで成功しなかった理由は2つありました。インデックスの構築に欠陥があり、インデックス作成が間違っていました。これが成功しただろう:

for(i in 1:(rowCount - 1)){ # need an expression that retruns a sequence 
    for (j in 1:rowCount)  # ditto 
    if (i == j){ 
     similMatrix[i,j] <- 0; # need to index the matrix with two element if using i,j 
    } 
} 
#---------- 
> show(similMatrix) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

しかし、Rのループに頼ることは、一般的に(。時には間違った理由のために)最後の手段と考えられているがあり、同じ「ループ」の操作を行うためのよりコンパクトな方法であり、それが一般化対角線を設定するだけではありません。

similMatrix[ row(similMatrix) == col(similMatrix) ] <- 0 
> similMatrix 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

あなたをゼロに副対角を設定したい場合は、単に使用することができます

similMatrix[ row(similMatrix)-1 == col(similMatrix) ] <- 0 

あなたはこれを使用して、余分な行やCOL行列の生成を回避することができます

mind <- min(dim(similMatrix)) 
# avoid going outside dimensions if not symmetric 
similMatrix[ cbind(seq(maxd),seq(maxd)) <- 0 
+0

これは完璧です、ありがとうございます! –

+1

私は '行(マット)'と 'col(マット)'が2つの行列を生成すると想像していますが、ここでメモリ消費量は3倍になっていますか? 'mat'が と大きくなった場合、これは問題を引き起こす可能性があります。 – qed

+0

かなり良いです。私はこれらが大きな行列であるとの警告は見ませんでした。私が提供していた「コンパクトさ」は表現にありましたが、あなたが指摘しているように、これはメモリの占有面積がコンパクトではないかもしれません。 'similMatrix [cbind(1:(rowCount - 1)、1:(rowCount - 1)] < - 0'を使って想像することができ、メモリとスピードの両方に関して優れた方法で実行すると思います。 「mat(diag(mat)」<-0>アプローチよりも足跡が小さくなる可能性があります。 –

27

に交換する必要があるあなたがのためにdiag<-

m <- matrix(1:12, nrow=3) 
m 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

diag(m) <- 0 
m 
    [,1] [,2] [,3] [,4] 
[1,] 0 4 7 10 
[2,] 2 0 8 11 
[3,] 3 6 0 12 
+0

「delete-my-answer-and-upvote-the-other」ボタンはどこにありますか? – mnel

+0

ありがとう、それは動作しますが、どうすればm [1、2]と言うことができますか? –

関連する問題