为矩阵的对角线条目赋值

时间:2013-01-14 01:51:32

标签: r matrix assign

我需要在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替换。

2 个答案:

答案 0 :(得分:31)

您需要功能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

答案 1 :(得分:11)

为了将“对角线”元素设置为零,你已经得到了答案,但我想知道你是否希望得到一些更通用的东西。该代码缺乏成功的原因有两方面:指数的构建存在缺陷,索引错误。这将成功:

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中使用循环通常被认为是最后的手段(有时是出于错误的原因。)有一种更紧凑的方式来执行相同的“循环”操作,它比仅设置对角线更广泛地推广。 / p>

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