12

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)

したがって、i = j の場合、行列の NA 値を 0 に置き換える必要があります。

4

2 に答える 2

40

あなたは機能が欲しい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
于 2013-01-14T02:02:04.737 に答える
14

「対角」要素をゼロに設定する目的で、すでに答えが与えられていますが、もっと一般的なものを望んでいたのではないかと思います。そのコードが成功しなかった理由は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

これを使用して、余分な行と列の行列を生成することを回避できます。

 mind <- min( dim(similMatrix) )
 # avoid going outside dimensions if not symmetric
 similMatrix[ cbind( seq(maxd),seq(maxd) ) <- 0
于 2013-01-14T02:24:49.577 に答える