用R中的特定值替换对角矩阵的值

时间:2017-11-16 19:58:33

标签: r matrix replace diagonal

我是整个编程和编码的新手,目前正在学校里学习R作为我的统计认证的一部分。

我们被要求创建一个名为'mat'的10 x 10矩阵,其中包含对角线上的数字1和非对角线上的0。

我使用以下方法完成了此操作:

mat<-diag(10)
mat
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
   [1,]    1    0    0    0    0    0    0    0    0     0
   [2,]    0    1    0    0    0    0    0    0    0     0
   [3,]    0    0    1    0    0    0    0    0    0     0
   [4,]    0    0    0    1    0    0    0    0    0     0
   [5,]    0    0    0    0    1    0    0    0    0     0
   [6,]    0    0    0    0    0    1    0    0    0     0
   [7,]    0    0    0    0    0    0    1    0    0     0
   [8,]    0    0    0    0    0    0    0    1    0     0
   [9,]    0    0    0    0    0    0    0    0    1     0
  [10,]    0    0    0    0    0    0    0    0    0     1

然后我被要求划分矩阵的k x k块,其中k = 3,并且还具有这种身份结构,并描述了执行此操作的方式。

我只知道如何执行以下操作:

 mat2<-mat[c(1,2,3),c(1,2,3)]
 mat2
          [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    1    0
    [3,]    0    0    1

到目前为止我觉得这么好吗?然而,现在我真的卡住了,我不知道怎么回事,mat2我现在被要求用这样的矩阵替换mat(mat2)的块对角线部分:

          [,1] [,2] [,3]
    [1,]    1   .5   .25
    [2,]   .5    1    .5
    [3,]  .25   .5     1

我的教授也暗示,使用外部函数会使这更容易,我真的不知道我怎么能这样做,我尝试使用upper.tri和lower.tri函数,但我也不是也是成功的。

我非常感谢任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果准备好替换矩阵:

mat<-diag(10)
replacement <- matrix(c(1,.5,.25,.5,1,.5,.25,.5,1), nrow=3, byrow=T)
mat[c(1,2,3),c(1,2,3)] <- replacement

将它放入for循环以跨越整个对角线

for(idx in 1:8){
    mat[c(idx,idx+1,idx+2),c(idx,idx+1,idx+2)] <- replacement
}
mat
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] 1.00 0.50 0.25 0.00 0.00 0.00 0.00 0.00 0.00  0.00
 [2,] 0.50 1.00 0.50 0.25 0.00 0.00 0.00 0.00 0.00  0.00
 [3,] 0.25 0.50 1.00 0.50 0.25 0.00 0.00 0.00 0.00  0.00
 [4,] 0.00 0.25 0.50 1.00 0.50 0.25 0.00 0.00 0.00  0.00
 [5,] 0.00 0.00 0.25 0.50 1.00 0.50 0.25 0.00 0.00  0.00
 [6,] 0.00 0.00 0.00 0.25 0.50 1.00 0.50 0.25 0.00  0.00
 [7,] 0.00 0.00 0.00 0.00 0.25 0.50 1.00 0.50 0.25  0.00
 [8,] 0.00 0.00 0.00 0.00 0.00 0.25 0.50 1.00 0.50  0.25
 [9,] 0.00 0.00 0.00 0.00 0.00 0.00 0.25 0.50 1.00  0.50
[10,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.25 0.50  1.00