为矩阵的对角线条目赋值

DI *_* MI 11 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)
Run Code Online (Sandbox Code Playgroud)

因此,如果i = j,则矩阵中的NA值需要替换为0.

Mat*_*erg 34

你想要这个功能 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
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 12

为了将"对角线"元素设置为零,您已经得到了答案,但我想知道您是否希望获得更通用的内容.该代码缺乏成功的原因有两方面:指数的构建存在缺陷,索引错误.这会成功:

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
Run Code Online (Sandbox Code Playgroud)

但是在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
Run Code Online (Sandbox Code Playgroud)

如果你想将subdiagonal设置为零,你可以使用:

similMatrix[ row(similMatrix)-1 == col(similMatrix) ] <- 0
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法避免生成额外的行和列矩阵:

 mind <- min( dim(similMatrix) )
 # avoid going outside dimensions if not symmetric
 similMatrix[ cbind( seq(maxd),seq(maxd) ) <- 0
Run Code Online (Sandbox Code Playgroud)