R 为矩阵的对角项赋值

R 为矩阵的对角项赋值,r,matrix,assign,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(similMatr

我需要访问和分配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)

rowCount您想要函数
diag将“对角线”元素设置为零,您已经得到了答案,但我想知道您是否希望得到更一般的结果。代码没有成功的原因有两个:索引的构造有缺陷,索引错误。这本可以成功:

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
for(i in 1:(rowCount-1)){#需要一个运行序列的表达式
对于(j in 1:rowCount)#同上
如果(i==j){
相似矩阵[i,j]显示(相似矩阵)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]0钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
[2,]NA 0-NA-NA-NA-NA
[3,]NA-NA 0-NA-NA-NA-NA
[4,]NA-NA-0-NA-NA-NA-NA
[5,]NA NA 0 NA NA NA
[6,]NA-NA-NA-0-NA-NA-NA
[7,]NA-NA-NA-0-NA-NA
[8,]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)==col(similMatrix)]similMatrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]0钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
[2,]NA 0-NA-NA-NA-NA
[3,]NA-NA 0-NA-NA-NA-NA
[4,]NA-NA-0-NA-NA-NA-NA
[5,]NA NA 0 NA NA NA
[6,]NA-NA-NA-0-NA-NA-NA
[7,]NA-NA-NA-0-NA-NA
[8,]NA NA NA 0 NA
如果要将次对角线设置为零,可以使用:

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

similMatrix[row(similMatrix)-1==col(similMatrix)]你没有得到想要的输出吗?那
删除我的答案并向上投票另一个
按钮在哪里?谢谢,它可以工作,但是我现在如何为m[1,2]赋值呢?我想象
row(mat)
col(mat)
将生成两个矩阵,这是否意味着我们的内存消耗增加了三倍?如果
mat
恰好很大,我想这可能会导致问题。完全正确。我没有看到任何关于这些矩阵很大的警告。“紧凑性”我提供的是表达式,但正如您所指出的,这在内存占用方面可能不够紧凑。可以想象使用
similMatrix[cbind(1:(rowCount-1),1:(rowCount-1)]
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